Ereignisse sind eines der Paradigmen, um eine asynchrone Ausführung zu erreichen. Aber nicht alle asynchronen Systeme verwenden Ereignisse. Das ist die semantische Bedeutung dieser beiden - eine ist die Super-Einheit der anderen.
epoll und aio verwenden unterschiedliche Metaphern:
epoll ist eine blockierende Operation (epoll_wait()
) - Sie blockieren den Thread, bis ein Ereignis eintritt, und senden das Ereignis dann an verschiedene Prozeduren/Funktionen/Zweige in Ihrem Code.
In AIO übergeben Sie die Adresse Ihrer Callback-Funktion (Vervollständigungsroutine) an das System und das System ruft Ihre Funktion auf, wenn etwas passiert.
Das Problem mit AIO ist, dass Ihr Callback-Funktionscode auf dem Systemthread und so auf dem Systemstapel ausgeführt wird. Ein paar Probleme damit, wie Sie sich vorstellen können.
Das sind völlig verschiedene Dinge.
Das ereignisgesteuerte Paradigma bedeutet, dass ein Objekt namens "Ereignis" immer dann an das Programm gesendet wird, wenn etwas passiert, ohne dass dieses "Etwas" in regelmäßigen Abständen abgefragt werden muss, um festzustellen, ob es passiert ist. Dieses „Ereignis“ kann vom Programm abgefangen werden, um einige Aktionen auszuführen (d. h. einen „Handler“) – entweder synchron oder asynchron.
Daher kann die Behandlung von Ereignissen entweder synchron oder asynchron sein. JavaScript verwendet beispielsweise ein synchrones Ereignissystem.
Asynchron bedeutet, dass Aktionen unabhängig vom aktuellen "Haupt"-Ausführungsstrom ausgeführt werden können. Wohlgemerkt, das tut es NICHT bedeutet "parallel" oder "anderer Faden". Eine "asynchrone" Aktion kann tatsächlich auf dem Haupt-Thread ausgeführt werden und in der Zwischenzeit den "Haupt"-Ausführungsstrom blockieren. Verwechseln Sie „asynchron“ also nicht mit „Multi-Threading“.
Man kann sagen, dass technisch gesehen eine asynchrone Operation automatisch annimmt eventing - mindestens "abgeschlossen", "fehlerhaft" oder "abgebrochen/abgebrochen" Ereignisse (eines oder mehrere davon) werden an den Initiator der Operation (oder das zugrunde liegende O/S selbst) gesendet, um zu signalisieren, dass die Operation beendet wurde . Async ist also immer ereignisgesteuert, aber nicht umgekehrt.
Ereignisgesteuert ist ein einzelner Thread, in dem Ereignisse für ein bestimmtes Szenario registriert werden. Wenn dieses Szenario auftritt, werden die Ereignisse ausgelöst. Jedoch werden auch zu diesem Zeitpunkt alle Ereignisse sequentiell ausgelöst. Daran ist nichts Asynchrones. Node.js (Webserver) verwendet Ereignisse, um mehrere Anfragen zu verarbeiten.
Asynchron ist im Grunde Multitasking. Es kann mehrere Threads oder Prozesse erzeugen, um eine bestimmte Funktion auszuführen. Es unterscheidet sich grundlegend von ereignisgesteuert in dem Sinne, dass jeder Thread unabhängig ist und kaum mit dem Hauptthread in einer einfachen reaktionsfähigen Weise interagiert. Apache (Webserver) verwendet mehrere Threads, um eingehende Anfragen zu verarbeiten.