select — Warten auf I/O-Abschluss¶
Dieses Modul bietet Zugriff auf die select() und poll() Funktionen, die in den meisten Betriebssystemen verfügbar sind, devpoll(), das auf Solaris und Derivaten verfügbar ist, epoll(), das unter Linux 2.5+ verfügbar ist, und kqueue(), das auf den meisten BSD-Systemen verfügbar ist. Beachten Sie, dass es unter Windows nur für Sockets funktioniert; auf anderen Betriebssystemen funktioniert es auch für andere Dateitypen (insbesondere unter Unix funktioniert es für Pipes). Es kann nicht für reguläre Dateien verwendet werden, um festzustellen, ob eine Datei seit dem letzten Lesen gewachsen ist.
Hinweis
Das Modul selectors ermöglicht ein High-Level- und effizientes I/O-Multiplexing, das auf den Primitiven des Moduls select aufbaut. Es wird empfohlen, das Modul selectors zu verwenden, es sei denn, Sie möchten die verwendeten OS-Level-Primitive präzise steuern.
Verfügbarkeit: nicht WASI.
Dieses Modul funktioniert nicht oder ist nicht auf WebAssembly verfügbar. Weitere Informationen finden Sie unter WebAssembly-Plattformen.
Das Modul definiert Folgendes
- select.devpoll()¶
(Nur auf Solaris und Derivaten unterstützt.) Gibt ein
/dev/pollPolling-Objekt zurück. Siehe Abschnitt /dev/poll Polling-Objekte unten für die von devpoll-Objekten unterstützten Methoden.devpoll()Objekte sind an die Anzahl der Dateideskriptoren gebunden, die zum Zeitpunkt der Instanziierung zulässig sind. Wenn Ihr Programm diesen Wert reduziert, schlägtdevpoll()fehl. Wenn Ihr Programm diesen Wert erhöht, kanndevpoll()eine unvollständige Liste aktiver Dateideskriptoren zurückgeben.Der neue Dateideskriptor ist nicht vererbbar.
Hinzugefügt in Version 3.3.
Geändert in Version 3.4: Der neue Dateideskriptor ist jetzt nicht vererbbar.
- select.epoll(sizehint=-1, flags=0)¶
(Nur unter Linux 2.5.44 und neuer unterstützt.) Gibt ein Epoll-Objekt zurück, das als Edge- oder Level-Trigger-Schnittstelle für I/O-Ereignisse verwendet werden kann.
sizehint informiert epoll über die erwartete Anzahl der zu registrierenden Ereignisse. Es muss positiv sein oder
-1für die Verwendung des Standardwerts. Es wird nur auf älteren Systemen verwendet, auf denenepoll_create1()nicht verfügbar ist; andernfalls hat es keine Auswirkung (obwohl sein Wert immer noch überprüft wird).flags ist veraltet und wird vollständig ignoriert. Wenn es jedoch angegeben wird, muss sein Wert
0oderselect.EPOLL_CLOEXECsein, andernfalls wirdOSErrorausgelöst.Siehe Abschnitt Edge- und Level-Trigger-Polling (epoll)-Objekte unten für die von Epoll-Objekten unterstützten Methoden.
epollObjekte unterstützen das Kontextmanagement-Protokoll: Wenn sie in einerwith-Anweisung verwendet werden, wird der neue Dateideskriptor am Ende des Blocks automatisch geschlossen.Der neue Dateideskriptor ist nicht vererbbar.
Geändert in Version 3.3: Der Parameter flags wurde hinzugefügt.
Geändert in Version 3.4: Die Unterstützung für die
with-Anweisung wurde hinzugefügt. Der neue Dateideskriptor ist jetzt nicht vererbbar.Veraltet seit Version 3.4: Der Parameter flags.
select.EPOLL_CLOEXECwird jetzt standardmäßig verwendet. Verwenden Sieos.set_inheritable(), um den Dateideskriptor vererbbar zu machen.
- select.poll()¶
(Nicht von allen Betriebssystemen unterstützt.) Gibt ein Polling-Objekt zurück, das das Registrieren und Deregistrieren von Dateideskriptoren sowie deren Abfrage auf I/O-Ereignisse unterstützt. Siehe Abschnitt Polling-Objekte unten für die von Polling-Objekten unterstützten Methoden.
- select.kqueue()¶
(Nur auf BSD unterstützt.) Gibt ein Kernel-Queue-Objekt zurück. Siehe Abschnitt Kqueue-Objekte unten für die von kqueue-Objekten unterstützten Methoden.
Der neue Dateideskriptor ist nicht vererbbar.
Geändert in Version 3.4: Der neue Dateideskriptor ist jetzt nicht vererbbar.
- select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶
(Nur auf BSD unterstützt.) Gibt ein Kernel-Ereignisobjekt zurück. Siehe Abschnitt Kevent-Objekte unten für die von kevent-Objekten unterstützten Methoden.
- select.select(rlist, wlist, xlist[, timeout])¶
Dies ist eine einfache Schnittstelle zum Unix-Systemaufruf
select(). Die ersten drei Argumente sind Iterables von „wartbaren Objekten“: entweder Integer, die Dateideskriptoren darstellen, oder Objekte mit einer parameterlosen Methode namensfileno(), die einen solchen Integer zurückgibt.rlist: warten, bis bereit zum Lesen ist
wlist: warten, bis bereit zum Schreiben ist
xlist: warten auf eine „außergewöhnliche Bedingung“ (siehe Handbuchseite, was Ihr System als solche Bedingung betrachtet)
Leere Iterables sind zulässig, aber die Akzeptanz von drei leeren Iterables ist plattformabhängig. (Es ist bekannt, dass es unter Unix funktioniert, aber nicht unter Windows.) Das optionale Argument timeout gibt eine Zeitüberschreitung als Gleitkommazahl in Sekunden an. Wenn das Argument timeout weggelassen wird, blockiert die Funktion, bis mindestens ein Dateideskriptor bereit ist. Ein Zeitüberschreitungswert von Null gibt ein Polling an und blockiert niemals.
Der Rückgabewert ist ein Tripel von Listen von Objekten, die bereit sind: Teilmengen der ersten drei Argumente. Wenn die Zeitüberschreitung erreicht ist, ohne dass ein Dateideskriptor bereit wird, werden drei leere Listen zurückgegeben.
Unter den akzeptablen Objekttypen in den Iterables sind Python Datei-Objekte (z. B.
sys.stdinoder vonopen()oderos.popen()zurückgegebene Objekte), Socket-Objekte, die vonsocket.socket()zurückgegeben werden. Sie können auch selbst eine Wrapper-Klasse definieren, solange sie eine geeignetefileno()-Methode hat (die tatsächlich einen Dateideskriptor zurückgibt, nicht nur eine zufällige Ganzzahl).Hinweis
Datei-Objekte unter Windows sind nicht akzeptabel, aber Sockets sind es. Unter Windows wird die zugrunde liegende
select()-Funktion von der WinSock-Bibliothek bereitgestellt und behandelt keine Dateideskriptoren, die nicht von WinSock stammen.Geändert in Version 3.5: Die Funktion wird jetzt mit einer neu berechneten Zeitüberschreitung wiederholt, wenn sie durch ein Signal unterbrochen wird, es sei denn, der Signalhandler löst eine Ausnahme aus (siehe PEP 475 für die Begründung), anstatt
InterruptedErrorauszulösen.
- select.PIPE_BUF¶
Die minimale Anzahl von Bytes, die ohne Blockieren in eine Pipe geschrieben werden können, wenn die Pipe von
select(),poll()oder einer anderen Schnittstelle in diesem Modul als schreibbereit gemeldet wurde. Dies gilt nicht für andere Arten von dateiähnlichen Objekten wie Sockets.Dieser Wert ist durch POSIX garantiert, mindestens 512 zu betragen.
Verfügbarkeit: Unix
Hinzugefügt in Version 3.2.
/dev/poll Polling-Objekte¶
Solaris und Derivate haben /dev/poll. Während select() *O*(*höchster Dateideskriptor*) ist und poll() *O*(*Anzahl der Dateideskriptoren*) ist, ist /dev/poll *O*(*aktive Dateideskriptoren*).
/dev/poll Das Verhalten ist dem Standard-Polling-Objekt poll() sehr ähnlich.
- devpoll.close()¶
Schließt den Dateideskriptor des Polling-Objekts.
Hinzugefügt in Version 3.4.
- devpoll.closed¶
Gibt
Truezurück, wenn das Polling-Objekt geschlossen ist.Hinzugefügt in Version 3.4.
- devpoll.fileno()¶
Gibt die Dateideskriptor-Nummer des Polling-Objekts zurück.
Hinzugefügt in Version 3.4.
- devpoll.register(fd[, eventmask])¶
Registriert einen Dateideskriptor beim Polling-Objekt. Zukünftige Aufrufe der Methode
poll()prüfen dann, ob der Dateideskriptor ausstehende I/O-Ereignisse hat. fd kann entweder eine Ganzzahl oder ein Objekt mit einerfileno()-Methode sein, die eine Ganzzahl zurückgibt. Datei-Objekte implementierenfileno(), sodass sie ebenfalls als Argument verwendet werden können.eventmask ist eine optionale Bitmaske, die die Art der zu prüfenden Ereignisse beschreibt. Die Konstanten sind dieselben wie bei einem
poll()-Objekt. Der Standardwert ist eine Kombination der KonstantenPOLLIN,POLLPRIundPOLLOUT.Warnung
Das Registrieren eines bereits registrierten Dateideskriptors ist kein Fehler, aber das Ergebnis ist undefiniert. Die geeignete Vorgehensweise ist, ihn zuerst zu deregistrieren oder zu ändern. Dies ist ein wichtiger Unterschied zu
poll().
- devpoll.modify(fd[, eventmask])¶
Diese Methode führt eine
unregister()gefolgt von einerregister()aus. Sie ist (ein wenig) effizienter, als dies explizit zu tun.
- devpoll.unregister(fd)¶
Entfernt einen Dateideskriptor, der von einem Polling-Objekt verfolgt wird. Genau wie die Methode
register()kann fd eine Ganzzahl oder ein Objekt mit einerfileno()-Methode sein, die eine Ganzzahl zurückgibt.Der Versuch, einen nie registrierten Dateideskriptor zu entfernen, wird sicher ignoriert.
- devpoll.poll([timeout])¶
Fragt den Satz der registrierten Dateideskriptoren ab und gibt eine möglicherweise leere Liste zurück, die
(fd, event)2-Tupel für die Deskriptoren enthält, die Ereignisse oder Fehler zu melden haben. fd ist der Dateideskriptor, und event ist eine Bitmaske mit gesetzten Bits für die gemeldeten Ereignisse für diesen Deskriptor –POLLINfür wartenden Input,POLLOUT, um anzuzeigen, dass der Deskriptor beschrieben werden kann, und so weiter. Eine leere Liste zeigt an, dass der Aufruf abgelaufen ist und keine Dateideskriptoren Ereignisse zu melden hatten. Wenn timeout angegeben ist, gibt er die Wartezeit in Millisekunden an, bevor Ereignisse zurückgegeben werden. Wenn timeout weggelassen wird, -1 oderNoneist, blockiert der Aufruf, bis ein Ereignis für dieses Poll-Objekt vorliegt.Geändert in Version 3.5: Die Funktion wird jetzt mit einer neu berechneten Zeitüberschreitung wiederholt, wenn sie durch ein Signal unterbrochen wird, es sei denn, der Signalhandler löst eine Ausnahme aus (siehe PEP 475 für die Begründung), anstatt
InterruptedErrorauszulösen.
Edge- und Level-Trigger-Polling (epoll)-Objekte¶
https://linux.die.net/man/4/epoll
eventmask
Konstante
Bedeutung
EPOLLINVerfügbar zum Lesen
EPOLLOUTVerfügbar zum Schreiben
EPOLLPRIDringende Daten zum Lesen
EPOLLERRFehlerbedingung bei der zugehörigen fd
EPOLLHUPHang-up bei der zugehörigen fd
EPOLLETEdge-Trigger-Verhalten einstellen, Standard ist Level-Trigger-Verhalten
EPOLLONESHOTEinmaliges Verhalten einstellen. Nach dem Abrufen eines Ereignisses wird die fd intern deaktiviert
EPOLLEXCLUSIVEWeckt nur ein epoll-Objekt, wenn die zugehörige fd ein Ereignis hat. Standard (wenn dieses Flag nicht gesetzt ist) ist, alle epoll-Objekte zu wecken, die auf einer fd abfragen.
EPOLLRDHUPBei Stream-Sockets wurde die Verbindung vom Peer geschlossen oder die Schreibhälfte der Verbindung heruntergefahren.
EPOLLRDNORMÄquivalent zu
EPOLLIN
EPOLLRDBANDPrioritätsdatenband kann gelesen werden.
EPOLLWRNORMÄquivalent zu
EPOLLOUT
EPOLLWRBANDPrioritätsdaten können geschrieben werden.
EPOLLMSGIgnoriert.
EPOLLWAKEUPVerhindert das Einschlafen während des Ereignis-Wartens.
Hinzugefügt in Version 3.6:
EPOLLEXCLUSIVEwurde hinzugefügt. Es wird nur von Linux Kernel 4.5 oder neuer unterstützt.Hinzugefügt in Version 3.14:
EPOLLWAKEUPwurde hinzugefügt. Es wird nur von Linux Kernel 3.5 oder neuer unterstützt.
- epoll.close()¶
Schließt den Steuerungs-Dateideskriptor des Epoll-Objekts.
- epoll.closed¶
Gibt
Truezurück, wenn das Epoll-Objekt geschlossen ist.
- epoll.fileno()¶
Gibt die Dateideskriptor-Nummer des Steuerungs-FDs zurück.
- epoll.fromfd(fd)¶
Erstellt ein Epoll-Objekt aus einem gegebenen Dateideskriptor.
- epoll.register(fd[, eventmask])¶
Registriert einen FD-Deskriptor beim Epoll-Objekt.
- epoll.modify(fd, eventmask)¶
Ändert einen registrierten Dateideskriptor.
- epoll.unregister(fd)¶
Entfernt einen registrierten Dateideskriptor aus dem Epoll-Objekt.
Geändert in Version 3.9: Die Methode ignoriert den Fehler
EBADFnicht mehr.
- epoll.poll(timeout=None, maxevents=-1)¶
Wartet auf Ereignisse. Timeout in Sekunden (float)
Geändert in Version 3.5: Die Funktion wird jetzt mit einer neu berechneten Zeitüberschreitung wiederholt, wenn sie durch ein Signal unterbrochen wird, es sei denn, der Signalhandler löst eine Ausnahme aus (siehe PEP 475 für die Begründung), anstatt
InterruptedErrorauszulösen.
Polling-Objekte¶
Der Systemaufruf poll(), der auf den meisten Unix-Systemen unterstützt wird, bietet eine bessere Skalierbarkeit für NetzwerksERVER, die viele, sehr viele Clients gleichzeitig bedienen. poll() skaliert besser, da der Systemaufruf nur das Auflisten der interessierenden Dateideskriptoren erfordert, während select() eine Bitmap erstellt, Bits für die interessierenden FDs einschaltet und dann anschließend die gesamte Bitmap erneut linear gescannt werden muss. select() ist *O*(*höchster Dateideskriptor*), während poll() *O*(*Anzahl der Dateideskriptoren*) ist.
- poll.register(fd[, eventmask])¶
Registriert einen Dateideskriptor beim Polling-Objekt. Zukünftige Aufrufe der Methode
poll()prüfen dann, ob der Dateideskriptor ausstehende I/O-Ereignisse hat. fd kann entweder eine Ganzzahl oder ein Objekt mit einerfileno()-Methode sein, die eine Ganzzahl zurückgibt. Datei-Objekte implementierenfileno(), sodass sie ebenfalls als Argument verwendet werden können.eventmask ist eine optionale Bitmaske, die die Art der zu prüfenden Ereignisse beschreibt und eine Kombination der Konstanten
POLLIN,POLLPRIundPOLLOUTsein kann, die in der nachstehenden Tabelle beschrieben sind. Wenn sie nicht angegeben ist, wird der Standardwert verwendet, der alle 3 Arten von Ereignissen prüft.Konstante
Bedeutung
POLLINEs gibt Daten zum Lesen
POLLPRIEs gibt dringende Daten zum Lesen
POLLOUTBereit für Ausgabe: Schreiben wird nicht blockieren
POLLERRFehlerbedingung irgendwelcher Art
POLLHUPAufgelegt
POLLRDHUPPeer einer Stream-Socket-Verbindung hat die Verbindung geschlossen oder die Schreibhälfte der Verbindung heruntergefahren
POLLNVALUngültige Anfrage: Deskriptor nicht geöffnet
Das Registrieren eines bereits registrierten Dateideskriptors ist kein Fehler und hat dieselbe Auswirkung wie das einmalige Registrieren des Deskriptors.
- poll.modify(fd, eventmask)¶
Modifiziert einen bereits registrierten Dateideskriptor. Dies hat denselben Effekt wie
register(fd, eventmask). Der Versuch, einen Dateideskriptor zu ändern, der nie registriert wurde, löst eineOSError-Ausnahme mit errnoENOENTaus.
- poll.unregister(fd)¶
Entfernt einen von einem Pollobjekt verfolgten Dateideskriptor. Genau wie bei der Methode
register()kann fd eine Ganzzahl oder ein Objekt mit einer Methodefileno()sein, die eine Ganzzahl zurückgibt.Der Versuch, einen nie registrierten Dateideskriptor zu entfernen, löst eine
KeyError-Ausnahme aus.
- poll.poll([timeout])¶
Pollt die Menge der registrierten Dateideskriptoren und gibt eine möglicherweise leere Liste von 2-Tupeln mit
(fd, event)zurück, für die Deskriptoren Ereignisse oder Fehler zu melden sind. fd ist der Dateideskriptor und event ist eine Bitmaske mit gesetzten Bits für die gemeldeten Ereignisse für diesen Deskriptor –POLLINfür wartende Eingaben,POLLOUT, um anzuzeigen, dass der Deskriptor beschrieben werden kann, und so weiter. Eine leere Liste zeigt an, dass der Aufruf abgelaufen ist und keine Dateideskriptoren Ereignisse zu melden hatten. Wenn timeout angegeben ist, gibt er die Zeit in Millisekunden an, die das System auf Ereignisse wartet, bevor es zurückkehrt. Wenn timeout weggelassen, negativ oderNoneist, blockiert der Aufruf, bis ein Ereignis für dieses Pollobjekt vorliegt.Geändert in Version 3.5: Die Funktion wird jetzt mit einem neu berechneten Timeout erneut versucht, wenn sie durch ein Signal unterbrochen wird, es sei denn, der Signalhandler löst eine Ausnahme aus (siehe PEP 475 für die Begründung), anstatt
InterruptedErrorauszulösen.
Kqueue-Objekte¶
- kqueue.close()¶
Schließt den Steuer-Dateideskriptor des Kqueue-Objekts.
- kqueue.closed¶
True, wenn das Kqueue-Objekt geschlossen ist.
- kqueue.fileno()¶
Gibt die Dateideskriptor-Nummer des Steuerungs-FDs zurück.
- kqueue.fromfd(fd)¶
Erstellt ein Kqueue-Objekt aus einem gegebenen Dateideskriptor.
- kqueue.control(changelist, max_events[, timeout]) eventlist¶
Low-Level-Schnittstelle zu kevent
changelist muss ein Iterable von kevent-Objekten oder
Noneseinmax_events muss 0 oder eine positive Ganzzahl sein
timeout in Sekunden (Gleitkommazahlen möglich); der Standardwert ist
None, um ewig zu warten
Geändert in Version 3.5: Die Funktion wird jetzt mit einem neu berechneten Timeout erneut versucht, wenn sie durch ein Signal unterbrochen wird, es sei denn, der Signalhandler löst eine Ausnahme aus (siehe PEP 475 für die Begründung), anstatt
InterruptedErrorauszulösen.
Kevent-Objekte¶
https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
- kevent.ident¶
Wert, der zur Identifizierung des Ereignisses verwendet wird. Die Interpretation hängt vom Filter ab, aber es ist normalerweise der Dateideskriptor. Im Konstruktor kann ident entweder eine Ganzzahl oder ein Objekt mit einer Methode
fileno()sein. kevent speichert die Ganzzahl intern.
- kevent.filter¶
Name des Kernel-Filters.
Konstante
Bedeutung
KQ_FILTER_READNimmt einen Deskriptor und gibt zurück, wenn Daten zum Lesen verfügbar sind
KQ_FILTER_WRITENimmt einen Deskriptor und gibt zurück, wenn Daten zum Schreiben verfügbar sind
KQ_FILTER_AIOAIO-Anfragen
KQ_FILTER_VNODEGibt zurück, wenn eines oder mehrere der angeforderten Ereignisse, die in fflag überwacht werden, auftreten
KQ_FILTER_PROCÜberwacht Ereignisse bei einer Prozess-ID
KQ_FILTER_NETDEVÜberwacht Ereignisse bei einem Netzwerkgerät [nicht auf macOS verfügbar]
KQ_FILTER_SIGNALGibt zurück, wenn das überwachte Signal an den Prozess gesendet wird
KQ_FILTER_TIMERRichtet einen beliebigen Timer ein
- kevent.flags¶
Filteraktion.
Konstante
Bedeutung
KQ_EV_ADDFügt ein Ereignis hinzu oder modifiziert es
KQ_EV_DELETEEntfernt ein Ereignis aus der Warteschlange
KQ_EV_ENABLEErlaubt control(), das Ereignis zurückzugeben
KQ_EV_DISABLEDeaktiviert das Ereignis
KQ_EV_ONESHOTEntfernt das Ereignis nach dem ersten Auftreten
KQ_EV_CLEARSetzt den Zustand zurück, nachdem ein Ereignis abgerufen wurde
KQ_EV_SYSFLAGSinternes Ereignis
KQ_EV_FLAG1internes Ereignis
KQ_EV_EOFFilterspezifische EOF-Bedingung
KQ_EV_ERRORSiehe Rückgabewerte
- kevent.fflags¶
Filterspezifische Flags.
KQ_FILTER_READundKQ_FILTER_WRITEFilter-FlagsKonstante
Bedeutung
KQ_NOTE_LOWATLow-Watermark des Socket-Puffers
KQ_FILTER_VNODEFilter-FlagsKonstante
Bedeutung
KQ_NOTE_DELETEunlink() wurde aufgerufen
KQ_NOTE_WRITEein Schreibvorgang ist erfolgt
KQ_NOTE_EXTENDdie Datei wurde erweitert
KQ_NOTE_ATTRIBein Attribut wurde geändert
KQ_NOTE_LINKdie Link-Anzahl hat sich geändert
KQ_NOTE_RENAMEdie Datei wurde umbenannt
KQ_NOTE_REVOKEder Zugriff auf die Datei wurde widerrufen
KQ_FILTER_PROCFilter-FlagsKonstante
Bedeutung
KQ_NOTE_EXITder Prozess wurde beendet
KQ_NOTE_FORKder Prozess hat fork() aufgerufen
KQ_NOTE_EXECder Prozess hat einen neuen Prozess ausgeführt
KQ_NOTE_PCTRLMASKinternes Filter-Flag
KQ_NOTE_PDATAMASKinternes Filter-Flag
KQ_NOTE_TRACKfolgt einem Prozess über fork() hinweg
KQ_NOTE_CHILDwird für den Kindprozess für NOTE_TRACK zurückgegeben
KQ_NOTE_TRACKERRkann sich nicht an ein Kind anhängen
KQ_FILTER_NETDEVFilter-Flags (nicht auf macOS verfügbar)Konstante
Bedeutung
KQ_NOTE_LINKUPVerbindung ist aktiv
KQ_NOTE_LINKDOWNVerbindung ist inaktiv
KQ_NOTE_LINKINVLink-Status ist ungültig
- kevent.data¶
Filterspezifische Daten.
- kevent.udata¶
Benutzerdefinierter Wert.