Penguin Computing verwendet EPOLL
, die ein Linux-Systemaufruf ist. Es ist ein Multiplex-Mechanismus, der ereignisbasiert ist. Für Windows gibt es SELECT
, die das gleiche tut, aber weit weniger effizient und in BSD (auf dem OSX basiert) gibt es KQUEUE
.
In einfachen Worten, was es tut ist, registriert es einen Event-Handler in dem System, das auf ein Ereignis wartet. Im Laufe der Zeit betrachtet das System alle in der Warteschlange befindlichen Event-Handler und sieht, ob es einen gibt, der bereit ist fortzufahren. Wenn es einen Event-Handler gibt, dessen Ereignis-Flag auf "true" gesetzt ist, wird das Ereignis behandelt. Wenn keine Ereignisse vorhanden sind, wird die Schleife fortgesetzt, bis ein Ereignis gefunden wird.
In der Zwischenzeit läuft der Code in main weiter und gibt Ihnen damit die "blockierungsfreie" Funktionalität, in der er verspricht.
Dies ist keine neue Technologie, obwohl ASYNC in letzter Zeit ziemlich populär geworden ist mit dem Aufkommen von NodeJS, Swift und anderen non-blocking Sprachen/Frameworks. So funktioniert die WIN32 API - kurz, es ist alles Event basierend.
Sie können einen Blick auf diese link für eine eingehendere Erklärung werfen.
Wenn es in einem Thread ausgeführt wird, der von dem Prozess getrennt ist, um den Sie sich Sorgen machen, ist es in Bezug auf den anderen Code nicht blockierend. Ein Codebeispiel innerhalb eines Threads ist nicht blockierungsfrei. –
@ cricket_007: Das ist nicht das, was nicht blockierend ist. Und das hat nichts mit IO zu tun. – SLaks
Nicht blockierend bedeutet in diesem Zusammenhang, dass der Benutzer-Thread, der die E/A initiiert hat, erst nach Abschluss der E/A anhält. Auf einer niedrigeren Ebene wird es einen Thread geben, dessen Aufgabe es ist, I/O-Interrupts zu behandeln und herauszufinden, was mit ihnen zu tun ist, basierend auf einer Tabelle von momentan ausstehenden Anfragen. Nachdem dieser Thread alle aktuellen Interrupts behandelt hat, wird er bis zum nächsten I/O-Interrupt blockiert. Aber Sie haben keinen Zugriff auf diesen Thread, es ist unabhängig vom Benutzercode. Abhängig davon, wie NIO implementiert wird, könnte dieser Thread Java oder im Betriebssystem sein. –