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

exception select.error

Ein veralteter Alias für OSError.

Geändert in Version 3.3: Gemäß PEP 3151 wurde diese Klasse zu einem Alias von OSError gemacht.

select.devpoll()

(Nur auf Solaris und Derivaten unterstützt.) Gibt ein /dev/poll Polling-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ägt devpoll() fehl. Wenn Ihr Programm diesen Wert erhöht, kann devpoll() 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 -1 für die Verwendung des Standardwerts. Es wird nur auf älteren Systemen verwendet, auf denen epoll_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 0 oder select.EPOLL_CLOEXEC sein, andernfalls wird OSError ausgelöst.

Siehe Abschnitt Edge- und Level-Trigger-Polling (epoll)-Objekte unten für die von Epoll-Objekten unterstützten Methoden.

epoll Objekte unterstützen das Kontextmanagement-Protokoll: Wenn sie in einer with-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_CLOEXEC wird jetzt standardmäßig verwendet. Verwenden Sie os.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 namens fileno(), 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.stdin oder von open() oder os.popen() zurückgegebene Objekte), Socket-Objekte, die von socket.socket() zurückgegeben werden. Sie können auch selbst eine Wrapper-Klasse definieren, solange sie eine geeignete fileno()-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 InterruptedError auszulö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.

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 True zurü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 einer fileno()-Methode sein, die eine Ganzzahl zurückgibt. Datei-Objekte implementieren fileno(), 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 Konstanten POLLIN, POLLPRI und POLLOUT.

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 einer register() 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 einer fileno()-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 – POLLIN fü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 oder None ist, 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 InterruptedError auszulösen.

Edge- und Level-Trigger-Polling (epoll)-Objekte

https://linux.die.net/man/4/epoll

eventmask

Konstante

Bedeutung

EPOLLIN

Verfügbar zum Lesen

EPOLLOUT

Verfügbar zum Schreiben

EPOLLPRI

Dringende Daten zum Lesen

EPOLLERR

Fehlerbedingung bei der zugehörigen fd

EPOLLHUP

Hang-up bei der zugehörigen fd

EPOLLET

Edge-Trigger-Verhalten einstellen, Standard ist Level-Trigger-Verhalten

EPOLLONESHOT

Einmaliges Verhalten einstellen. Nach dem Abrufen eines Ereignisses wird die fd intern deaktiviert

EPOLLEXCLUSIVE

Weckt 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.

EPOLLRDHUP

Bei Stream-Sockets wurde die Verbindung vom Peer geschlossen oder die Schreibhälfte der Verbindung heruntergefahren.

EPOLLRDNORM

Äquivalent zu EPOLLIN

EPOLLRDBAND

Prioritätsdatenband kann gelesen werden.

EPOLLWRNORM

Äquivalent zu EPOLLOUT

EPOLLWRBAND

Prioritätsdaten können geschrieben werden.

EPOLLMSG

Ignoriert.

EPOLLWAKEUP

Verhindert das Einschlafen während des Ereignis-Wartens.

Hinzugefügt in Version 3.6: EPOLLEXCLUSIVE wurde hinzugefügt. Es wird nur von Linux Kernel 4.5 oder neuer unterstützt.

Hinzugefügt in Version 3.14: EPOLLWAKEUP wurde 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 True zurü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 EBADF nicht 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 InterruptedError auszulö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 einer fileno()-Methode sein, die eine Ganzzahl zurückgibt. Datei-Objekte implementieren fileno(), 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, POLLPRI und POLLOUT sein 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

POLLIN

Es gibt Daten zum Lesen

POLLPRI

Es gibt dringende Daten zum Lesen

POLLOUT

Bereit für Ausgabe: Schreiben wird nicht blockieren

POLLERR

Fehlerbedingung irgendwelcher Art

POLLHUP

Aufgelegt

POLLRDHUP

Peer einer Stream-Socket-Verbindung hat die Verbindung geschlossen oder die Schreibhälfte der Verbindung heruntergefahren

POLLNVAL

Ungü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 eine OSError-Ausnahme mit errno ENOENT aus.

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 Methode fileno() 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 – POLLIN fü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 oder None ist, 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 InterruptedError auszulö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 None sein

  • max_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 InterruptedError auszulö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_READ

Nimmt einen Deskriptor und gibt zurück, wenn Daten zum Lesen verfügbar sind

KQ_FILTER_WRITE

Nimmt einen Deskriptor und gibt zurück, wenn Daten zum Schreiben verfügbar sind

KQ_FILTER_AIO

AIO-Anfragen

KQ_FILTER_VNODE

Gibt 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_SIGNAL

Gibt zurück, wenn das überwachte Signal an den Prozess gesendet wird

KQ_FILTER_TIMER

Richtet einen beliebigen Timer ein

kevent.flags

Filteraktion.

Konstante

Bedeutung

KQ_EV_ADD

Fügt ein Ereignis hinzu oder modifiziert es

KQ_EV_DELETE

Entfernt ein Ereignis aus der Warteschlange

KQ_EV_ENABLE

Erlaubt control(), das Ereignis zurückzugeben

KQ_EV_DISABLE

Deaktiviert das Ereignis

KQ_EV_ONESHOT

Entfernt das Ereignis nach dem ersten Auftreten

KQ_EV_CLEAR

Setzt den Zustand zurück, nachdem ein Ereignis abgerufen wurde

KQ_EV_SYSFLAGS

internes Ereignis

KQ_EV_FLAG1

internes Ereignis

KQ_EV_EOF

Filterspezifische EOF-Bedingung

KQ_EV_ERROR

Siehe Rückgabewerte

kevent.fflags

Filterspezifische Flags.

KQ_FILTER_READ und KQ_FILTER_WRITE Filter-Flags

Konstante

Bedeutung

KQ_NOTE_LOWAT

Low-Watermark des Socket-Puffers

KQ_FILTER_VNODE Filter-Flags

Konstante

Bedeutung

KQ_NOTE_DELETE

unlink() wurde aufgerufen

KQ_NOTE_WRITE

ein Schreibvorgang ist erfolgt

KQ_NOTE_EXTEND

die Datei wurde erweitert

KQ_NOTE_ATTRIB

ein Attribut wurde geändert

KQ_NOTE_LINK

die Link-Anzahl hat sich geändert

KQ_NOTE_RENAME

die Datei wurde umbenannt

KQ_NOTE_REVOKE

der Zugriff auf die Datei wurde widerrufen

KQ_FILTER_PROC Filter-Flags

Konstante

Bedeutung

KQ_NOTE_EXIT

der Prozess wurde beendet

KQ_NOTE_FORK

der Prozess hat fork() aufgerufen

KQ_NOTE_EXEC

der Prozess hat einen neuen Prozess ausgeführt

KQ_NOTE_PCTRLMASK

internes Filter-Flag

KQ_NOTE_PDATAMASK

internes Filter-Flag

KQ_NOTE_TRACK

folgt einem Prozess über fork() hinweg

KQ_NOTE_CHILD

wird für den Kindprozess für NOTE_TRACK zurückgegeben

KQ_NOTE_TRACKERR

kann sich nicht an ein Kind anhängen

KQ_FILTER_NETDEV Filter-Flags (nicht auf macOS verfügbar)

Konstante

Bedeutung

KQ_NOTE_LINKUP

Verbindung ist aktiv

KQ_NOTE_LINKDOWN

Verbindung ist inaktiv

KQ_NOTE_LINKINV

Link-Status ist ungültig

kevent.data

Filterspezifische Daten.

kevent.udata

Benutzerdefinierter Wert.