select — čekanje na događaje na skupu tokova

Ovaj modul pruža funkcije za učinkovito čekanje sve dok jedan ili više tokova (objekata sličnih datotekama koji implementiraju protokol toka, poput utičnica, UART-ova i drugih I/O objekata) ne bude spreman za čitanje ili pisanje, umjesto zauzetog čekanja ili blokiranja na jednom objektu.

Objekt poll je preporučeno sučelje: skalira se na mnogo tokova i ne zauzima memoriju kada se koristi putem poll.ipoll(). Funkcija select() na razini modula manje je učinkovito sučelje za kompatibilnost.

Primjer korištenja objekta poll

import select

poller = select.poll()
poller.register(uart, select.POLLIN)

while True:
    # Wait up to 1000 ms for the UART to have data.
    for obj, event in poller.poll(1000):
        if event & select.POLLIN:
            print(obj.read())

Primjer korištenja funkcije select() na razini modula:

import select

# Wait up to 1 second for the socket to become readable.
rlist, wlist, xlist = select.select([sock], [], [], 1.0)
if rlist:
    data = sock.recv(100)

Funkcije

select.select(rlist: List, wlist: List, xlist: List, timeout: float | None = None) Tuple[List, List, List]

Čeka sve dok jedan ili više zadanih objekata toka ne bude spremno, ili dok ne istekne timeout.

  • rlist je popis objekata koji se prate radi mogućnosti čitanja.

  • wlist je popis objekata koji se prate radi mogućnosti pisanja.

  • xlist je popis objekata koji se prate radi pogreške ili stanja prekida veze.

  • timeout je maksimalno vrijeme čekanja, u sekundama (prihvaća se decimalni broj). Ako je izostavljen ili None, poziv blokira neograničeno; 0 se vraća odmah (neblokirajuće ispitivanje).

Vraća 3-torku popisa (rlist, wlist, xlist). Svaki vraćeni popis je podskup odgovarajućeg ulaznog popisa koji sadrži objekte koji su postali spremni za čitanje, spremni za pisanje, odnosno koji su signalizirali pogrešku/prekid veze. Ako timeout istekne, a ništa nije spremno, sva tri popisa su prazna.

Ova funkcija je manje učinkovita od poll (ponovno gradi svoj interni skup za ispitivanje pri svakom pozivu); gdje je moguće, koristite poll.

Konstante

select.POLLIN: int

Postoje podaci dostupni za čitanje iz toka.

select.POLLOUT: int

Tok može prihvatiti više podataka za pisanje.

select.POLLERR: int

Na toku je došlo do stanja pogreške. Ovo je neželjeni (unsolicited) događaj: prijavljuju ga poll.poll() / poll.ipoll() čak i ako nije zatražen u eventmask, te ga nije valjano proslijediti kao ulazni eventmask.

select.POLLHUP: int

Tok je prekinuo vezu / odspojen je. Ovo je neželjeni (unsolicited) događaj: prijavljuju ga poll.poll() / poll.ipoll() čak i ako nije zatražen u eventmask, te ga nije valjano proslijediti kao ulazni eventmask.

Klase

class select.poll

Stvara objekt za ispitivanje koji održava skup registriranih tokova (ili bilo kojih objekata koji izlažu protokol toka) i učinkovito čeka sve dok jedan ili više njih ne postane čitljiv, zapisiv ili signalizira izvanredno stanje.

Tokovi se dodaju s register(), uklanjaju s unregister(), a skup događaja koji se prate može se promijeniti s modify(). Kada je konfiguriran, pozovite poll() za blokiranje dok nešto ne bude spremno (ili dok ne istekne istek vremena), ili ipoll() za varijantu temeljenu na iteratoru koja ne zauzima memoriju.

register(obj: Any, eventmask: int = select.POLLIN | select.POLLOUT) None

Registrira tok obj za ispitivanje, prateći događaje zadane s eventmask (logički OR sljedećeg):

eventmask prema zadanim postavkama je select.POLLIN | select.POLLOUT.

select.POLLHUP i select.POLLERR nisu valjani u ulaznom eventmask – to su neželjeni događaji koje prijavljuju poll() / ipoll() bez obzira na to jesu li zatraženi (ovo odgovara POSIX semantici).

U redu je pozvati ovu metodu više puta za isti obj: naknadni poziv ažurira masku događaja za obj, ponašajući se poput modify().

unregister(obj: Any) None

Uklanja obj iz skupa registriranih tokova. Nije pogreška odjaviti obj koji trenutno nije registriran (poziv u tom slučaju nema učinka).

modify(obj: Any, eventmask: int) None

Mijenja masku događaja za već registrirani obj u eventmask. Podiže OSError s errno.ENOENT ako obj nije registriran.

poll(timeout: int = -1, /) List[Tuple]

Blokira sve dok barem jedan registrirani tok ne postane spreman ili signalizira izvanredno stanje, zatim vraća popis tokova koji su se aktivirali.

timeout je maksimalno vrijeme čekanja u milisekundama. Ako je izostavljen ili -1, poziv blokira neograničeno; 0 se vraća odmah (neblokirajuće ispitivanje).

Vraća popis (obj, event, ...) n-torki, jednu po toku koji se aktivirao. obj je registrirani tok, a event je bitovni OR zastavica select.POLLIN / select.POLLOUT / select.POLLERR / select.POLLHUP koje su se dogodile. Svaka n-torka može sadržavati dodatne elemente definirane implementacijom, stoga ne pretpostavljajte da je duljina točno 2. Ako timeout istekne, a ništa nije spremno, vraća se prazan popis.

select.POLLHUP i select.POLLERR mogu se vratiti u bilo kojem trenutku (čak i ako nisu zatraženi) i na njih se mora reagirati – obično odjavom i zatvaranjem zahvaćenog toka – inače će se naknadni pozivi nastaviti odmah vraćati s tim zastavicama postavljenima za taj tok.

Zajamčeno je da će se svi zakazani povratni pozivi na čekanju izvršiti prije ulaska u petlju ispitivanja.

Razlika u odnosu na CPython

Vraćene n-torke mogu sadržavati više od 2 elementa, kako je opisano gore.

ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]

Poput poll(), ali umjesto izgradnje popisa vraća iterator koji daje jednu (obj, event, ...) n-torku odjednom. Time se izbjegava zauzimanje memorije pri svakom pozivu, što je važno za asinkrone I/O rasporeditelje.

Dana n-torka je u vlasništvu pozvane strane (callee-owned): ponovno se koristi (prepisuje) pri sljedećoj iteraciji, stoga se njezin sadržaj mora konzumirati unutar tijela petlje, a reference na nju ne smiju se pohranjivati.

timeout ima isto značenje kao za poll(). Ako je flags jednak 1, koristi se ponašanje s jednim okidanjem (one-shot): tok čiji se događaj aktivirao automatski dobiva obrisanu masku događaja (ekvivalentno poll.modify(obj, 0)), tako da se za njega ne prijavljuju daljnji događaji dok se njegova maska ponovno ne postavi s modify().

Zajamčeno je da će se svi zakazani povratni pozivi na čekanju izvršiti prije ulaska u petlju ispitivanja.

Razlika u odnosu na CPython

Ova metoda je MicroPython proširenje.