====== Asynchronous Programming ====== Asynchronous Programming (česky asynchronní programování) je programovací technika, při které program nemusí čekat na dokončení časově náročné operace a může mezitím pokračovat ve vykonávání dalšího kódu. Tento přístup je běžný zejména ve webových aplikacích, síťové komunikaci, práci se soubory a serverových technologiích, jako jsou [[javascript]] a [[node.js]]. ===== Proč vzniklo asynchronní programování ===== Některé operace mohou trvat relativně dlouho: načítání dat ze serveru, komunikace s databází, čtení a zápis souborů, síťová komunikace, stahování obsahu z internetu. Pokud by program na dokončení těchto operací čekal, mohl by být neaktivní nebo zablokovaný. ===== Synchronní vs. asynchronní programování ===== ==== Synchronní zpracování ==== Při synchronním zpracování program čeká na dokončení každého kroku. Krok 1 ↓ Dokončení ↓ Krok 2 ↓ Dokončení ↓ Krok 3 Výhodou je jednoduchost, nevýhodou možné blokování programu. ==== Asynchronní zpracování ==== Při asynchronním zpracování může program pokračovat v práci, zatímco se operace provádí na pozadí. Spuštění operace ↓ Program pokračuje dál ↓ Operace dokončena ↓ Zpracování výsledku ===== Příklad v JavaScriptu ===== Synchronní kód: console.log("První"); console.log("Druhý"); console.log("Třetí"); Výstup: První Druhý Třetí Asynchronní kód: console.log("První"); setTimeout(() => { console.log("Druhý"); }, 1000); console.log("Třetí"); Výstup: První Třetí Druhý ===== Callbacky ===== Historicky byly asynchronní operace řešeny pomocí [[callback]] funkcí. setTimeout(function() { console.log("Hotovo"); }, 1000); Při větším množství callbacků mohl vzniknout problém označovaný jako ''Callback Hell''. ===== Promise ===== Modernější řešení představují [[promise]] objekty. fetch("/data") .then(response => response.json()) .then(data => console.log(data)); Promise reprezentuje hodnotu, která bude dostupná až v budoucnu. ===== Async/Await ===== Nejpřehlednější způsob zápisu asynchronního kódu nabízí konstrukce ''async'' a ''await''. async function nactiData() { const response = await fetch("/data"); const data = await response.json(); console.log(data); } Kód se podobá synchronnímu zápisu, ale stále pracuje asynchronně. ===== Event Loop ===== V prostředí JavaScriptu je asynchronní programování úzce spojeno s mechanismem [[event loop]]. Event Loop: sleduje frontu událostí, zpracovává callbacky, koordinuje asynchronní operace, umožňuje efektivní využití jednoho vlákna. ===== Oblasti použití ===== Webové aplikace. REST API. Databázové operace. Streamování dat. Síťová komunikace. Mobilní aplikace. Cloudové služby. IoT systémy. ===== Výhody ===== Vyšší výkon aplikace. Lepší odezva uživatelského rozhraní. Efektivní využití systémových prostředků. Možnost současného zpracování více úloh. ===== Nevýhody ===== Složitější návrh aplikace. Náročnější ladění chyb. Obtížnější sledování toku programu. Riziko závodních podmínek (race conditions). ===== Související pojmy ===== [[javascript]] [[node.js]] [[callback]] [[promise]] [[async await]] [[event]] [[event loop]] [[event-driven programming]] [[multithreading]] ===== Shrnutí ===== Asynchronous Programming je způsob programování, při kterém aplikace nemusí čekat na dokončení časově náročných operací. Může pokračovat ve vykonávání dalších úloh a výsledek zpracovat až ve chvíli, kdy je připraven. Díky tomu jsou moderní aplikace rychlejší, lépe reagují na uživatele a efektivněji využívají systémové prostředky.