select — vänta på händelser på en uppsättning strömmar¶
Denna modul tillhandahåller funktioner för att effektivt vänta tills en eller flera strömmar (filliknande objekt som implementerar strömprotokollet, såsom sockets, UART:er och andra I/O-objekt) är redo för läsning eller skrivning, i stället för att aktivt vänta eller blockera på ett enda objekt.
poll-objektet är det rekommenderade gränssnittet: det skalar till många strömmar och är allokeringsfritt när det används via poll.ipoll(). Funktionen select() på modulnivå är ett mindre effektivt kompatibilitetsgränssnitt.
Exempel med ett poll-objekt:
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())
Exempel med funktionen select() på modulnivå:
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)
Funktioner¶
- select.select(rlist: List, wlist: List, xlist: List, timeout: float | None = None) Tuple[List, List, List]¶
Vänta tills ett eller flera av de angivna strömobjekten är redo, eller tills timeout löper ut.
rlist är en lista över objekt att övervaka för läsbarhet.
wlist är en lista över objekt att övervaka för skrivbarhet.
xlist är en lista över objekt att övervaka för ett fel- eller frånkopplingstillstånd.
timeout är den maximala tiden att vänta, i sekunder (ett flyttal accepteras). Om det utelämnas eller är
Noneblockerar anropet i obestämd tid;0returnerar omedelbart (en icke-blockerande pollning).
Returnerar en 3-tupel av listor
(rlist, wlist, xlist). Varje returnerad lista är den delmängd av motsvarande indatalista som innehåller de objekt som blev redo för läsning, redo för skrivning, respektive som signalerade ett fel/en frånkoppling. Om timeout löper ut utan att något är redo är alla tre listorna tomma.Denna funktion är mindre effektiv än
poll(den bygger om sin interna pollningsuppsättning vid varje anrop); användpolli stället där det är möjligt.
Konstanter¶
- select.POLLERR: int¶
Ett feltillstånd uppstod på strömmen. Detta är en oönskad händelse: den rapporteras av
poll.poll()/poll.ipoll()även om den inte begärdes i eventmask, och det är inte giltigt att skicka den som en indata-eventmask.
- select.POLLHUP: int¶
Strömmen kopplades ner / frånkopplades. Detta är en oönskad händelse: den rapporteras av
poll.poll()/poll.ipoll()även om den inte begärdes i eventmask, och det är inte giltigt att skicka den som en indata-eventmask.
Klasser¶
- class select.poll¶
Skapa ett pollningsobjekt som upprätthåller en uppsättning registrerade strömmar (eller vilka objekt som helst som exponerar strömprotokollet) och effektivt väntar tills en eller flera av dem blir läsbara, skrivbara eller signalerar ett undantagstillstånd.
Strömmar läggs till med
register(), tas bort medunregister(), och uppsättningen händelser att bevaka kan ändras medmodify(). När den väl är konfigurerad, anropapoll()för att blockera tills något är redo (eller en timeout löper ut), elleripoll()för en allokeringsfri iteratorbaserad variant.- register(obj: Any, eventmask: int = select.POLLIN | select.POLLOUT) None¶
Registrera strömmen obj för pollning, med bevakning av de händelser som anges av eventmask (den logiska OR av):
select.POLLIN– data är tillgängliga att läsaselect.POLLOUT– strömmen kan ta emot mer data att skriva
eventmask har som standard
select.POLLIN | select.POLLOUT.select.POLLHUPochselect.POLLERRär inte giltiga i en indata-eventmask – de är oönskade händelser som rapporteras avpoll()/ipoll()oavsett om de efterfrågades eller ej (detta matchar POSIX-semantiken).Det går bra att anropa denna metod mer än en gång för samma obj: ett efterföljande anrop uppdaterar obj:s händelsemask och beter sig som
modify().
- unregister(obj: Any) None¶
Ta bort obj från uppsättningen registrerade strömmar. Det är inte ett fel att avregistrera ett obj som inte är registrerat för tillfället (anropet har ingen effekt i det fallet).
- modify(obj: Any, eventmask: int) None¶
Ändra händelsemasken för ett redan registrerat obj till eventmask. Utlöser
OSErrormederrno.ENOENTom obj inte är registrerat.
- poll(timeout: int = -1, /) List[Tuple]¶
Blockera tills minst en registrerad ström blir redo eller signalerar ett undantagstillstånd, och returnera sedan listan över de strömmar som utlöstes.
timeout är den maximala tiden att vänta i millisekunder. Om det utelämnas eller är
-1blockerar anropet i obestämd tid;0returnerar omedelbart (en icke-blockerande pollning).Returnerar en lista över
(obj, event, ...)-tupler, en per ström som utlöstes.objär den registrerade strömmen ocheventär den bitvisa OR av flaggornaselect.POLLIN/select.POLLOUT/select.POLLERR/select.POLLHUPsom inträffade. Varje tupel kan innehålla ytterligare implementationsdefinierade element, så anta inte en längd på exakt 2. Om timeout löper ut utan att något är redo returneras en tom lista.select.POLLHUPochselect.POLLERRkan returneras när som helst (även om de inte begärts) och måste hanteras – vanligtvis genom att avregistrera och stänga den berörda strömmen – annars kommer efterföljande anrop att fortsätta returnera omedelbart med dessa flaggor satta för den strömmen.Eventuella väntande schemalagda återanrop garanteras köras innan pollningsloopen påbörjas.
Skillnad mot CPython
Returnerade tupler kan innehålla fler än 2 element, så som beskrivs ovan.
- ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]¶
Som
poll(), men i stället för att bygga en lista returnerar den en iterator som ger en(obj, event, ...)-tupel åt gången. Detta undviker allokering vid varje anrop, vilket är viktigt för asynkrona I/O-schemaläggare.Den genererade tupeln är anropad-ägd: den återanvänds (skrivs över) vid nästa iteration, så dess innehåll måste konsumeras inom loopkroppen och referenser till den får inte lagras.
timeout har samma betydelse som för
poll(). Om flags är1används engångsbeteende: en ström vars händelse utlöstes får sin händelsemask automatiskt nollställd (motsvarandepoll.modify(obj, 0)), så inga ytterligare händelser rapporteras för den förrän dess mask sätts igen medmodify().Eventuella väntande schemalagda återanrop garanteras köras innan pollningsloopen påbörjas.
Skillnad mot CPython
Denna metod är en MicroPython-utökning.