Asynchroner i/o

In Informatik, asynchroner i/o (Auch Nicht-sequentielle I/O) ist eine Form von Input-Output Verarbeitung, die es anderen ermöglicht wird bearbeitet vor dem fortzusetzen Übertragung hat beendet. Ein Name, der für asynchrone E/A in der Windows -API verwendet wird, ist überlappte i/o.

Eingabe- und Ausgangsvorgänge (E/A) auf einem Computer können im Vergleich zur Verarbeitung von Daten extrem langsam sein. Ein E/A -Gerät kann mechanische Geräte enthalten, die sich physisch bewegen müssen, z. B. eine Festplatte, die einen Track zum Lesen oder Schreiben sucht. Dies ist oft Größenordnungen langsamer als das Wechsel des elektrischen Stroms. Zum Beispiel während einer Festplattenoperation, die zehn Millisekunden zur Durchführung benötigt, wird ein Prozessor, der mit einem getaktet wird Gigahertz hätte zehn Millionen Anweisungszyklen durchführen können.

Ein einfacher Ansatz für die E/A wäre, den Zugang zu starten und dann zu warten, bis er abgeschlossen ist. Aber ein solcher Ansatz (genannt synchrones i/o, oder blockieren i/o) würde den Fortschritt eines Programms blockieren, während die Kommunikation im Gange ist und geht Systemressourcen Leerlauf. Wenn ein Programm viele E/A -Operationen ausführt (z. B. ein Programm hauptsächlich oder weitgehend von abhängig Benutzereingabe), Dies bedeutet, dass der Prozessor fast die ganze Zeit im Leerlauf verbringen kann, um darauf zu warten, dass die E/A -Operationen abgeschlossen sind.

Alternativ ist es möglich, die Kommunikation zu starten und dann die Verarbeitung durchzuführen, die nicht erforderlich ist, dass die E/A abgeschlossen ist. Dieser Ansatz wird als asynchroner Eingang/Ausgang bezeichnet. Jede Aufgabe, die von der E/A abhängt, die erledigt hat (dies umfasst sowohl die Verwendung der Eingabewerte als auch die kritischen Operationen, die behaupten, dass ein Schreibvorgang abgeschlossen wurde), muss noch warten, bis die E/A -Operation abgeschlossen ist, und ist somit so Immer noch blockiert, aber eine andere Verarbeitung, die keine Abhängigkeit von der E/A -Operation hat, kann fortgesetzt werden.

Es gibt viele Betriebssystemfunktionen, um asynchrone E/A auf vielen Ebenen zu implementieren. In der Tat eine der Hauptfunktionen von allen bis auf die rudimentärsten von Betriebssysteme ist, mindestens eine Form von grundlegender asynchroner E/O durchzuführen, obwohl dies für den Benutzer oder den Programmierer möglicherweise nicht besonders offensichtlich ist. In der einfachsten Softwarelösung lautet der Status des Hardware -Geräts befragt In Intervallen, um festzustellen, ob das Gerät für den nächsten Betrieb bereit ist. (Zum Beispiel die CP/m Auf diese Weise wurde das Betriebssystem gebaut. Es ist Systemanruf Die Semantik erforderte keine ausführlichere E/A -Struktur als diese, obwohl die meisten Implementierungen komplexer und dadurch effizienter waren.) Direkter Speicherzugriff (DMA) kann die Effizienz eines Umfragesystems erheblich erhöhen, und Hardware unterbricht Kann die Bedürfnisse an Umfragen vollständig beseitigen. Multitasking Betriebssysteme können die von Hardware -Interrupts bereitgestellten Funktionen ausnutzen und gleichzeitig die Komplexität der Interrupt -Handhabung des Benutzers verbergen. Spulen war eine der ersten Formen von Multitasking, die asynchrone E/O ausnutzen konnten. Endlich, Multithreading und explizit asynchrones i/o Apis Innerhalb von Benutzerprozessen können asynchrone E/A auf Kosten der zusätzlichen Softwarekomplexität weiter nutzen.

Asynchrone E/A wird verwendet, um die Energieeffizienz und in einigen Fällen durch den Durchsatz zu verbessern. Es kann jedoch in einigen Fällen negative Auswirkungen auf die Latenz und den Durchsatz haben.

Formen

Formen von E/O und Beispielen von POSIX -Funktionen:

Blockierung Nicht blockierend Asynchron
API schreiben Lesen schreiben, lesen + Umfrage / auswählen aio_write, aio_read

Alle Formen von asynchronen E/A -Open -Anwendungen bis hin zu potenziellen Ressourcenkonflikten und zugeordneten Scheitern. Sorgfältige Programmierung (oft verwenden gegenseitiger Ausschluss, Semaphorenusw.) ist erforderlich, um dies zu verhindern.

Wenn Sie asynchrone E/A für Anwendungen aussetzen, gibt es einige umfassende Implementierungsklassen. Die Form der API Der an die Anwendung bereitgestellten Anwendung entspricht nicht unbedingt dem vom Betriebssystem tatsächlich bereitgestellten Mechanismus; Emulationen sind möglich. Darüber hinaus kann mehr als eine Methode von einer einzelnen Anwendung verwendet werden, abhängig von ihren Bedürfnissen und den Wünschen ihrer Programmierer. Viele Betriebssysteme liefern mehr als einen dieser Mechanismen, es ist möglich, dass einige alle von ihnen bereitstellen.

Verfahren

Erhältlich in früher Unix. In einem Multitasking Das Betriebssystem kann die Verarbeitung über verschiedene Prozesse verteilt werden, die unabhängig ausgeführt werden, ihren eigenen Speicher haben und ihre eigenen E/A -Ströme verarbeiten. Diese Flüsse sind normalerweise in verbunden Pipelines. Die Prozesse sind ziemlich teuer zu erstellen und zu warten, sodass diese Lösung nur gut funktioniert, wenn die Prozesse klein und relativ stabil sind. Es wird auch davon ausgegangen, dass die einzelnen Prozesse unabhängig voneinander arbeiten können, abgesehen von der Verarbeitung der E/A des anderen. Wenn sie auf andere Weise kommunizieren müssen, kann es schwierig werden, sie zu koordinieren.

Eine Erweiterung dieses Ansatzes ist Datenflow -Programmierung, was kompliziertere Netzwerke ermöglicht als nur die Ketten, die Rohre unterstützen.

Umfragen

Variationen:

  • Fehler, wenn es noch nicht gemacht werden kann (später Neuauflage)
  • Bericht, wenn es ohne Blockierung erfolgen kann (dann geben Sie es aus)

Umfragen liefert nicht blockierende synchrone API, die zur Implementierung einer asynchronen API verwendet werden können. Erhältlich in traditioneller Unix und Fenster. Sein Hauptproblem ist, dass es wiederholt CPU -Zeitabfragen verschwenden kann, wenn das Ausstellungsverfahren nichts anderes gibt, was die für andere Prozesse verfügbare Zeit verkürzt. Da eine Wahllokalanwendung im Wesentlichen Single-Thread ist, kann sie die E/A-Parallelität, zu der die Hardware in der Lage ist, möglicherweise nicht vollständig ausnutzen.

Wählen Sie (/Umfrage) Schleifen

Verfügbar in BSD Unixund fast alles andere mit einem TCP/IP Protokollstapel, der entweder verwendet oder nach der BSD -Implementierung modelliert wird. Eine Variation des Umfragethemas, eine ausgewählte Schleife verwendet die auswählen Systemanruf an schlafen bis ein Zustand auf a auftritt Dateideskriptor (z. B. wenn Daten für das Lesen verfügbar sind), a Auszeit tritt auf oder a Signal wird empfangen (z. B. wenn ein Kinderprozess stirbt). Durch Untersuchung der Rückgaberameter der auswählen Aufrufen, der Schleife findet heraus, welcher Dateideskriptor geändert hat und den entsprechenden Code ausführt. Oft wird die ausgewählte Schleife zur Benutzerfreundlichkeit als implementiert als Ereignisschleife, vielleicht benutze Rückruffunktionen; Die Situation eignet sich besonders gut für ereignisgesteuerte Programmierung.

Während diese Methode zuverlässig und relativ effizient ist, hängt sie stark von der ab Unix Paradigma das "Alles ist eine Datei"Jedes Blockierungs -I/O, bei dem kein Dateideskriptor beteiligt ist auswählen Anruf; Bibliotheken, die ihre eigene I/A durchführen, sind in dieser Hinsicht besonders problematisch. Ein zusätzliches potenzielles Problem ist, dass die Auswahl und die E/A -Operationen immer noch ausreichend entkoppelt sind, dass das Ergebnis von Select effektiv eine Lüge sein kann Daten, die zum Zeitpunkt der Ausgabe des Leseverhältnisses verschwunden sind, was zu Blockieren führt; Wenn zwei Prozesse in einen einzelnen Dateideskriptor (nicht das ungewöhnlich) schreiben, kann der Auswahl eine sofortige Schreibfähigkeit anzeigen, aber der Schreiben kann immer noch blockieren, da ein Puffer durch den anderen Prozess in der Zwischenzeit gefüllt wurde oder aufgrund des zu großen Schreibens aufgrund des Schreibens zu groß ist für den verfügbaren Puffer oder auf andere Weise, die für den Empfänger ungeeignet sind.

Die Auswahlschleife erreicht nicht die endgültige Systemeffizienz, die beispielsweise mit dem möglich ist Fertigstellung Warteschlangen Methode, weil die Semantik der auswählen Rufen Sie an, wie dies für die Pro-Call-Abstimmung des akzeptablen Ereignissatzes der Fall ist, und verbraucht eine gewisse Zeit pro Aufruf, die das Auswahlarray durchquert. Dadurch wird wenig Overhead für Benutzeranwendungen erstellt, bei denen möglicherweise einen Dateideskriptor für die geöffnet ist Fenstersystem und einige für offene Dateien, wird aber mehr zu einem Problem, wenn die Anzahl der potenziellen Ereignisquellen wächst und die Entwicklung vieler Serveranwendungen wie in der Klienten-Server behindern kann C10K -Problem; Andere asynchrone Methoden können in solchen Fällen merklich effizienter sein. Einige Unixe bieten systemspezifische Anrufe mit einer besseren Skalierung. zum Beispiel, Epoll in Linux (Das füllt das Array der Rückwahlauswahl nur mit diesen Ereignisquellen, auf denen ein Ereignis aufgetreten ist). Kqueue in Freebsdund Event Ports (und /Dev/Umfrage) in Solaris.

SVR3 Unix Vorausgesetzt Umfrage Systemanruf. Wohl besser benannt als auswählenFür die Zwecke dieser Diskussion ist es im Wesentlichen dasselbe. Svr4 unixes (und so Posix) Bieten Sie beide Anrufe an.

Signale (Interrupts)

Verfügbar in BSD und Posix Unix. E/A wird asynchron ausgestellt und wenn es abgeschlossen ist a Signal (unterbrechen) wird erzeugt. Wie bei der Programmierung von Kernel mit niedrigem Niveau sind die für den sicheren Gebrauch im Signalhandler verfügbaren Einrichtungen begrenzt, und der Hauptfluss des Prozesses könnte an nahezu jedem Punkt unterbrochen worden sein, was zu inkonsistenten Datenstrukturen führt, wie sie vom Signalhandler zu sehen ist. Der Signalhandler ist normalerweise nicht in der Lage, weitere asynchrone E/O selbst zu veröffentlichen.

Das Signal Der Ansatz, obwohl relativ einfach innerhalb des Betriebssystems zu implementiert ist, bringt das Anwendungsprogramm für das unerwünschte Gepäck mit dem Schreiben eines Kernel Interrupt -Systems eines Betriebssystems. Sein schlimmste Merkmal ist das jeder Das Blockierungssystem (synchrones) Systemaufruf ist potenziell unterbrochen; Der Programmierer muss in der Regel bei jedem Aufruf wiedererlangen Code einbeziehen.

Rückruffunktionen

Erhältlich in der Klassischer Mac OS, VMs und Fenster. Trägt viele der Eigenschaften der Signal Methode wie es im Grunde dasselbe ist, obwohl sie selten als solches anerkannt ist. Der Unterschied besteht darin, dass jede E/A -Anfrage normalerweise eine eigene Abschlussfunktion haben kann, während die Signal System hat einen einzelnen Rückruf.

Auf der anderen Seite ist ein potenzielles Problem bei der Verwendung von Rückrufen, dass die Stapeltiefe unmanagerisch wachsen kann, da es eine extrem häufige Sache tun kann, wenn ein E/A fertig ist, einen anderen zu planen. Wenn dies sofort erfüllt werden sollte, der erste zurückrufen ist nicht "abgewickelt" vom Stapel, bevor der nächste aufgerufen wird. Systeme zur Verhinderung dieser (z. In der Praxis ist dies jedoch im Allgemeinen kein Problem, da die neue I/A selbst normalerweise zurückkehren wird, sobald der neue E/A begonnen wird, so dass der Stapel "abgewickelt" werden kann. Das Problem kann auch verhindert werden, indem weitere Rückrufe durch eine Warteschlange vermieden werden, bis der erste Rückruf zurückgibt.

Leichte Prozesse oder Fäden

Leichte Prozesse (Lwps) oder Themen sind in moderneren Unixes erhältlich, die von Ursprung von erhältlich sind Plan 9 . Wie Prozess Methode, jedoch ohne die Datenisolation, die die Koordination der Strömungen behindert. Diese mangelnde Isolation führt seine eigenen Probleme ein und erfordert normalerweise von Kernel bereitgestellte Synchronisationsmechanismen und Thread-safe Bibliotheken. Jedes LWP oder Faden selbst verwendet traditionelle blockierende synchrone E/O. Der erforderliche separate Stapel pro Thread kann große Implementierungen mit einer sehr großen Anzahl von Threads ausschließen. Die Trennung von textuellen (Code) und Zeit (Ereignis) liefert einen fruchtbaren Grund für Fehler.

Dieser Ansatz wird auch in der verwendet Erlang Programmiersprach -Laufzeitsystem. Der Erlang virtuelle Maschine Verwendet asynchrone E/A mit einem kleinen Pool von nur wenigen Fäden oder manchmal nur einem Prozess, um E/A von bis zu Millionen von Erlang -Prozessen zu verarbeiten. Die E/A -Handhabung in jedem Prozess wird hauptsächlich mit der blockierenden synchronen E/A geschrieben. Auf diese Weise wird eine hohe Leistung der asynchronen E/A mit der Einfachheit der normalen E/O zusammengeführt (C.F. Schauspielermodell). Viele E/A-Probleme in Erlang werden dem Nachrichtenübergang zugeordnet, die mit integriertem selektivem Empfang problemlos verarbeitet werden können.

Fasern / Coroutinen Kann als ähnlich leichtgewichtiger Ansatz für asynchrones E/A außerhalb des Erlang -Laufzeitsystems angesehen werden, obwohl sie nicht genau die gleichen Garantien wie Erlang -Prozesse bieten.

Fertigstellung Warteschlangen/Ports

Verfügbar in Microsoft Windows, Solaris, Amigaos, Dnix und Linux (Verwendung io_uring, erhältlich auf 5.1 und höher).[1] E/A -Anfragen werden asynchron ausgestellt, jedoch werden Benachrichtigungen über die Fertigstellung über einen Synchronisierungs -Warteschlangenmechanismus in der Reihenfolge vorgesehen, in der sie abgeschlossen sind. Normalerweise mit a verbunden Zustandsmaschine Strukturierung des Hauptprozesses (ereignisgesteuerte Programmierung), die wenig Ähnlichkeit mit einem Prozess haben kann, bei dem keine asynchrone E/O verwendet wird oder die eine der anderen Formen verwendet, und die Wiederverwendung von Code behindert. Erfordert keine zusätzlichen speziellen Synchronisationsmechanismen oder Thread-safe Bibliotheken, noch sind die textuellen (Code) und Zeit (Ereignis) getrennt.

Ereignisflaggen

Verfügbar in VMs und Amigaos (häufig in Verbindung mit einem Fertigstellungsport). Trägt viele der Eigenschaften der Fertigstellung Warteschlange Methode, da es sich im Wesentlichen um eine Abschlusswarteschlange der Tiefe handelt. Um den Effekt der Warteschlange "Tiefe" zu simulieren, ist für jedes potenzielle unverarbeitete (aber abgeschlossene) Ereignis eine zusätzliche Ereignisflagge erforderlich, oder Ereignisinformationen können verloren gehen. Das Warten auf das nächste verfügbare Ereignis in einem solchen Klumpen erfordert Synchronisierungsmechanismen, die möglicherweise nicht gut auf eine größere Anzahl potenziell paralleler Ereignisse skalieren.

Kanal I/O

Erhältlich in Mainframes von IBM, Groupe Bull, und Unisys. Kanal I/O wurde entwickelt, um die CPU -Auslastung und den Durchsatz zu maximieren, indem die meisten E/A auf einen Koprozessor abgeladen werden. Der Coprozessor verfügt über DMA an Bord, behandelt Geräte -Interrupts, wird von der Haupt -CPU gesteuert und unterbricht nur die Haupt -CPU, wenn er wirklich notwendig ist. Diese Architektur unterstützt auch sogenannte Kanalprogramme, die auf dem Kanalprozessor für E/A-Aktivitäten und -Protokolle ausgeführt werden.

Registrierte i/o

Verfügbar in Windows Server 2012 und Windows 8. Optimiert für Anwendungen, die eine große Anzahl kleiner Nachrichten verarbeiten, um höher zu erreichen E/A -Operationen pro Sekunde mit reduziertem Jitter und Latenz.[2]

Implementierung

Die überwiegende Mehrheit der Allzweck-Computerhardware hängt ausschließlich auf zwei Methoden zur Implementierung von asynchronem E/O ab: Umfragen und Interrupts. Normalerweise werden beide Methoden zusammen verwendet, das Gleichgewicht hängt stark von der Gestaltung der Hardware und ihren erforderlichen Leistungsmerkmalen ab. (DMA ist nicht selbst eine andere unabhängige Methode, es ist lediglich ein Mittel, mit dem mehr Arbeit pro Umfrage oder Interrupt durchgeführt werden kann.)

Reine Wahlsysteme sind durchaus möglich, kleine Mikrocontroller (z. B. Systeme verwenden die Bild) werden oft auf diese Weise gebaut. CP/m Systeme könnten auch auf diese Weise aufgebaut werden (wenn auch selten), mit oder ohne DMA. Auch wenn die größte Leistung nur für a notwendig ist wenig Aufgaben auf Kosten anderer potenzieller Aufgaben können auch die Umfrage angemessen sein, da der Aufwand der Einnahme von Interrupts möglicherweise unerwünscht sein kann. (Wartung eines Interrupts erfordert Zeit [und Platz], um zumindest einen Teil des Prozessorzustands zu sparen, zusammen mit der Zeit, die erforderlich ist, um die unterbrochene Aufgabe wieder aufzunehmen.)

Die meisten allgemeinen Computersysteme stützen sich stark auf Interrupts. Ein reines Interrupt -System kann möglich sein, obwohl in der Regel auch einige Komponenten der Umfrage erforderlich sind, da es für mehrere potenzielle Interrupt -Quellen sehr häufig ist, um eine gemeinsame Interrupt -Signallinie zu teilen. Gerätetreiber um die tatsächliche Quelle zu beheben. (Diese Auflösungszeit trägt auch zur Leistungsstrafe eines Interrupt -Systems bei. Im Laufe der Jahre wurde viel Arbeit geleistet, um zu versuchen, den mit der Wartung eines Interrupt verbundenen Overheads zu minimieren Aber die allgemeine Zunahme der Hardwareleistung hat dies stark gemindert.)

Es sind auch hybride Ansätze möglich, wobei ein Interrupt den Beginn eines asynchronen E/O -Ausbruchs auslösen kann und innerhalb des Burst selbst die Wahl verwendet wird. Diese Technik ist häufig bei Hochgeschwindigkeitsgeräte-Treibern wie Netzwerk oder Festplatte, bei denen die Zeit bei der Rückkehr zur vorinruppten Aufgabe bis zur nächsten erforderlichen Wartung größer als die Zeit ist. (Heutzutage verwendete gemeinsame E/A-Hardware stützt Umfragen sind immer erfolgreich oder wiederholt ein kleines Mal.)

Zu einer Zeit war dieser hybride Ansatz bei Festplatten- und Netzwerktreibern üblich, bei denen keine DMA oder eine signifikante Pufferung verfügbar war. Da die gewünschten Übertragungsgeschwindigkeiten schneller waren, als die Mindestschleife von vier Operationen pro Datenbilde (Bittest, Konditional-Branch-zu-Selbst, Abholung und Speicher) zu tolerieren konnten, wurde die Hardware häufig mit automatisch erstellt Warten Sie Zustand Generierung auf dem E/A -Gerät, die Datenablenkung aus der Software auf den Abruf oder Speichern des Prozessors und die Reduzierung der programmierten Schleife auf zwei Vorgänge. (Verwenden Sie den Prozessor selbst als DMA -Motor.) Die 6502 Der Prozessor bot ein ungewöhnliches Mittel zur Bereitstellung einer Drei-Elemente-Schleife pro Daten, da er eine Hardware-Pin hatte, die bei Behauptung das Überlaufbit des Prozessors direkt einstellen würde. (Offensichtlich müsste man im Hardware -Design sehr sorgfältig aufpassen, um das Überlaufen außerhalb des Gerätetreibers zu vermeiden!)

Synthese

Unter Verwendung dieser beiden Tools (Umfragen und Interrupts) können alle anderen Formen der oben diskutierten asynchronen E/O -Diskussionen (und tatsächlich) synthetisiert werden.

In einer Umgebung wie a Java virtuelle Maschine (JVM), asynchrone E/O kann synthetisiert werden wenngleich Die Umgebung, in der die JVM betrieben wird, bietet sie möglicherweise überhaupt nicht an. Dies liegt an der interpretierten Natur des JVM. Die JVM kann regelmäßig umfragen (oder einen Interrupt einnehmen), um einen internen Kontrolländerungsfluss einzuführen und das Erscheinungsbild mehrerer gleichzeitiger Prozesse zu bewirken, von denen zumindest einige vermutlich vorhanden sind, um asynchrone E/A durchzuführen. (Natürlich mag die Parallelität auf mikroskopischer Ebene eher grob sein und einige nicht ideale Eigenschaften aufweisen, aber auf der Oberfläche scheint es wie gewünscht zu sein.)

Dies ist in der Tat das Problem bei der Verwendung von Umfragen in irgendeiner Form zur Synthese einer anderen Form von asynchronem E/O. Jeder CPU -Zyklus, der eine Umfrage ist, wird verschwendet und an Overhead verloren, anstatt eine gewünschte Aufgabe zu erfüllen. Jeder CPU -Zyklus, der ist nicht Eine Umfrage stellt eine Erhöhung der Reaktion der Reaktion auf ausstehende E/A dar. Es ist schwierig, ein akzeptables Gleichgewicht zwischen diesen beiden gegnerischen Kräften zu treffen. (Aus diesem Grund wurden Hardware -Interruptsysteme überhaupt erfunden.)

Der Trick zur Maximierung der Effizienz besteht darin, die Arbeit zu minimieren, die bei der Empfang eines Interrupts erledigt werden muss, um die entsprechende Anwendung zu wecken. Zweitens (aber vielleicht nicht weniger wichtig) ist die Methode, die die Anwendung selbst verwendet, um zu bestimmen, was sie tun muss.

Besonders problematisch (für die Anwendungseffizienz) sind die exponierten Wahlmethoden, einschließlich der ausgewählten/Wahlmechanismen. Obwohl die zugrunde liegenden E/A-Ereignisse, an denen sie interessiert sind zu Dieser Mechanismus wird befragt und kann in der Umfrage viel Zeit verbrauchen. Dies gilt insbesondere für die potenziell große Umfrage, die durch ausgewählte (und Umfrage) möglich ist. Interrupts Karte sehr gut zu Signalen, Rückruffunktionen, Fertigstellungswarteschlangen und Ereignisflags, solche Systeme können sehr effizient sein.

Beispiele

Folgende Beispiele zeigen Konzepte von drei E/A -Ansätzen zum Lesevorgang. Objekte und Funktionen sind abstrakt.

1. Blockieren, Synchron:

Gerät = Io.offen() Daten = Gerät.lesen() # Thread wird blockiert, bis Daten im Gerät Daten enthalten sind drucken(Daten) 

2. Blockieren und nicht blockierende, synchron: (hier hier Io.poll () Blöcke für bis zu 5 Sekunden, aber Gerät.read () nicht)

Gerät = Io.offen() bereit = FALSCH während nicht bereit:  drucken("Es gibt keine Daten zu lesen!")  bereit = Io.Umfrage(Gerät, Io.EINGANG, 5) # gibt die Kontrolle zurück, wenn 5 Sekunden verstrichen sind oder Daten zu lesen sind (Eingabe) Daten = Gerät.lesen() drucken(Daten) 

3. Nicht blockierende, asynchron:

iOS = Io.IoService() Gerät = Io.offen(iOS) def Inputhandler(Daten, irren):  "Eingabedatenhandler"  wenn nicht irren:  drucken(Daten) Gerät.Readsome(Inputhandler) iOS.Schleife() # Warten Sie, bis alle Operationen abgeschlossen sind, und rufen Sie alle entsprechenden Handler an 

Hier ist das gleiche Beispiel mit Asynchron/wartet:

iOS = Io.IoService() Gerät = Io.offen(iOS) Async def Aufgabe():  Versuchen:   Daten = erwarten Gerät.Readsome()  drucken(Daten)  außer:  passieren iOS.Aufgabe hinzufügen(Aufgabe) iOS.Schleife() # Warten Sie, bis alle Operationen abgeschlossen sind, und rufen Sie alle entsprechenden Handler an 

Hier ist das Beispiel mit Reaktormuster:

Gerät = Io.offen() Reaktor = Io.Reaktor() def Inputhandler(Daten):  "Eingabedatenhandler"  drucken(Daten)  Reaktor.Pause() Reaktor.Addhandler(Inputhandler, Gerät, Io.EINGANG) Reaktor.Lauf() # Run Reactor, der Ereignisse übernimmt und geeignete Handler anruft 

Siehe auch

Verweise

  1. ^ Corbet, Jonathan. "In einer neuen asynchronen E/O -API klingeln". Lwn.net. Abgerufen 27. Juli 2020.
  2. ^ "API-Erweiterungen für Eingabe-Output (RIO)". technet.microsoft.com.

Externe Links