Die erste besteht darin, eine Anfrage zu beantworten, die auf einer Theorie von Warteschlangen, FIFO, LIFO usw. basiert. Das heißt, bis das Ende des Prozesses nicht auf einen anderen übergeht, wäre dieses Verhalten für ein Programm, das Threads verarbeitet, kein Problem, da es für jede Anforderung, die bestimmte Funktionen erfüllt, mehrere Threads generieren könnte.
Dann haben wir die asynchrone Funktion, die uns dazu dient, mehrere Anfragen an einen Thread abhängig von deren Status zu bearbeiten. Wenn also mehrere Anfragen ausgeführt werden, während ein Prozess ausgeführt wird, können wir den nächsten bearbeiten, oder wir sollten nicht einmal auf das Senden einer Anfrage warten eine Kundeninformation:
Wie wir im Bild sehen, wird eine Chat-Simulation durchgeführt, bei der überprüft wird, bis eine Nachricht gesendet werden muss.
Asynchrone Eingabe- und Ausgabeprozesse
Wenn wir die Anforderungen des Clients asynchron lesen, ist es nicht erforderlich, die Nachricht zunächst vollständig zu lesen, aber dank der Geschwindigkeit der Verarbeitung können wir sie nach und nach erkennen.
Für die asynchrone Arbeit in Python haben wir zwei Funktionen, die uns helfen können, eine ist select und die andere poll , wobei letztere nur für UNIX- Umgebungen verfügbar ist. Daher könnte es eine Bedingung sein, dass wir ein Limit setzen, wenn wir dies möchten Ein plattformübergreifendes Programm ist jedoch die Lösung, die sich am besten skalieren lässt. Daher müssen wir diese Details berücksichtigen.
Die select- Funktion akzeptiert 3 Sequenzen als obligatorische Argumente, wobei ein viertes Argument optional ist und das Timeout in Sekunden enthält. Die Sequenzen sind Verbindungen, auf die wir warten werden, da 3 den folgenden Bedingungen entsprechen: Eingabe, Ausgabe, Ausnahmebedingungen (Fehler, Ausnahmen usw.).
Wenn wir keine Zeitüberschreitung angeben, wartet die Auswahlfunktion , bis eine der Sequenzen für die Aktion bereit ist. Wenn wir eine Zeitüberschreitung angeben, warten die Blöcke auf die entsprechende Zeit. Die von der Funktion zurückgegebenen Werte stellen eine aktive Teilmenge jeder Sequenz dar. Die erste zurückgegebene Sequenz ist beispielsweise eine Eingabesequenz, in der wir etwas zu lesen haben.
Nachfolgend sehen Sie ein Beispiel für die Implementierung eines Servers mit der Funktion select :
Socket importieren, auswählen s = socket.socket () host = socket.gethostname () port = 1234 an bind ((host, port)) s.listen (5) Eingänge = [s] während wahr: [b] rs, ws, es = select.select (Eingaben, [], []) [/ b] für r in rs: wenn r s ist: c, addr = s.accept () print 'Verbindung erhalten von', Adr inputs.append (c) sonst: versuche: data = r.recv (1024) nicht verbunden = keine Daten außer socket.error: disconnected = True wenn nicht verbunden: print r.getpeername (), 'disconnected' inputs.remove (r) sonst: Daten drucken
Wie wir sehen können, übergeben wir beim Aufrufen der Auswahlfunktion, die die 3 obligatorischen Sequenzen übergibt, die variablen Eingaben , die mit dem verknüpft sind, was der Server beim Abhören von TCP-Port 1234 abfängt, und iterieren dann, um die Informationen anzuzeigen.
Wie wir sehen, ist dieser Aspekt der Implementierung recht einfach und die Grenze wird durch unsere Kreativität zum Zeitpunkt der Erstellung des Programms gesetzt.