Události jsou jedním z paradigmat k dosažení asynchronního provádění. Ne všechny asynchronní systémy však události používají. To je o sémantickém významu těchto dvou - jedna je superentita druhé.
epoll a aio používají různé metafory:
epoll je operace blokování (epoll_wait()
) - zablokujete vlákno, dokud se nestane nějaká událost, a pak událost odešlete do různých procedur/funkcí/větví ve vašem kódu.
V AIO předáte adresu své funkce zpětného volání (rutina dokončení) systému a systém zavolá vaši funkci, když se něco stane.
Problém s AIO je, že váš kód funkce zpětného volání běží na systémovém vláknu a tak na vrcholu systémového zásobníku. Několik problémů s tím, jak si dokážete představit.
Jsou to úplně jiné věci.
Paradigma řízené událostmi znamená, že objekt zvaný „událost“ je odeslán do programu, kdykoli se něco stane, aniž by se toto „něco“ muselo v pravidelných intervalech dotazovat, aby se zjistilo, zda se to stalo. Tato "událost" může být zachycena programem, aby provedl některé akce (tj. "obslužný program") - synchronní nebo asynchronní.
Zpracování událostí tedy může být synchronní nebo asynchronní. JavaScript například používá synchronní systém událostí.
Asynchronní znamená, že akce mohou probíhat nezávisle na aktuálním „hlavním“ proudu provádění. Pozor, NE znamená "paralelní" nebo "různé vlákno". Na hlavním vlákně může ve skutečnosti běžet „asynchronní“ akce, která mezitím blokuje „hlavní“ spouštěcí proud. Nepleťte si tedy „asynchronní“ s „multi-threading“.
Můžete říci, že technicky vzato asynchronní operace automaticky předpokládá události – alespoň „dokončené“, „chybné“ nebo „přerušené/zrušené“ události (jedna nebo více z nich) jsou odeslány iniciátorovi operace (nebo samotnému základnímu O/S), aby signalizovaly, že operace byla ukončena . Async je tedy vždy řízen událostmi, ale ne naopak.
Událostí řízená je jedno vlákno, kde jsou události registrovány pro určitý scénář. Když nastane tento scénář, události se spustí. Nicméně i v té době je každá z událostí spuštěna postupně. Není na tom nic asynchronního. Node.js (webový server) používá události k řešení více požadavků.
Asynchronní je v podstatě multitasking. Může spustit více vláken nebo procesů k provedení určité funkce. Je to zcela odlišné od událostí řízených v tom smyslu, že každé vlákno je nezávislé a stěží interaguje s hlavním vláknem snadno a rychle. Apache (webový server) používá pro zpracování příchozích požadavků více vláken.