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;0se 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, koristitepoll.
Konstante¶
- 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 sunregister(), a skup događaja koji se prate može se promijeniti smodify(). Kada je konfiguriran, pozovitepoll()za blokiranje dok nešto ne bude spremno (ili dok ne istekne istek vremena), iliipoll()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):
select.POLLIN– podaci su dostupni za čitanjeselect.POLLOUT– tok može prihvatiti više podataka za pisanje
eventmask prema zadanim postavkama je
select.POLLIN | select.POLLOUT.select.POLLHUPiselect.POLLERRnisu valjani u ulaznom eventmask – to su neželjeni događaji koje prijavljujupoll()/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
OSErrorserrno.ENOENTako 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;0se vraća odmah (neblokirajuće ispitivanje).Vraća popis
(obj, event, ...)n-torki, jednu po toku koji se aktivirao.objje registrirani tok, aeventje bitovni OR zastavicaselect.POLLIN/select.POLLOUT/select.POLLERR/select.POLLHUPkoje 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.POLLHUPiselect.POLLERRmogu 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 jednak1, koristi se ponašanje s jednim okidanjem (one-shot): tok čiji se događaj aktivirao automatski dobiva obrisanu masku događaja (ekvivalentnopoll.modify(obj, 0)), tako da se za njega ne prijavljuju daljnji događaji dok se njegova maska ponovno ne postavi smodify().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.