select — Väntar på att I/O ska slutföras¶
Den här modulen ger tillgång till funktionerna select() och poll() som finns i de flesta operativsystem, devpoll() som finns på Solaris och derivat, epoll() som finns på Linux 2.5+ och kqueue() som finns på de flesta BSD. Observera att på Windows fungerar det bara för sockets; på andra operativsystem fungerar det även för andra filtyper (i synnerhet på Unix fungerar det på pipes). Det kan inte användas på vanliga filer för att avgöra om en fil har vuxit sedan den senast lästes.
Anteckning
Modulen selectors möjliggör effektiv I/O-multiplexering på hög nivå och bygger på primitiverna i modulen select. Användare uppmanas att använda modulen selectors i stället, om de inte vill ha exakt kontroll över de primitiver på OS-nivå som används.
Tillgänglighet: not WASI.
Den här modulen fungerar inte eller är inte tillgänglig på WebAssembly. Se WebAssembly-plattformar för mer information.
Modulen definierar följande:
- select.devpoll()¶
(Stöds endast på Solaris och derivat.) Returnerar ett
/dev/pollpolling-objekt; se avsnitt /dev/poll Polling Objects nedan för de metoder som stöds av devpoll-objekt.devpoll()-objekt är kopplade till det antal filbeskrivare som är tillåtna vid instantiering. Om ditt program minskar detta värde kommerdevpoll()att misslyckas. Om ditt program ökar detta värde kandevpoll()returnera en ofullständig lista över aktiva filbeskrivare.Den nya filbeskrivaren är icke-ärftlig.
Tillagd i version 3.3.
Ändrad i version 3.4: Den nya filbeskrivaren är nu inte ärftlig.
- select.epoll(sizehint=-1, flags=0)¶
(Stöds endast av Linux 2.5.44 och senare.) Returnerar ett Edge Polling-objekt, som kan användas som Edge- eller Level Triggered-gränssnitt för I/O-händelser.
sizehint informerar epoll om det förväntade antalet händelser som ska registreras. Den måste vara positiv, eller
\-1för att använda standardvärdet. Den används endast på äldre system därepoll_create1()inte är tillgänglig; annars har den ingen effekt (även om dess värde fortfarande kontrolleras).flags är föråldrad och ignoreras helt. Men när den anges måste dess värde vara
0ellerselect.EPOLL_CLOEXEC, annars uppstårOSError.Se avsnittet Objekt för pollning av kant- och nivåtrigger (epoll) nedan för de metoder som stöds av epolling-objekt.
epoll-objekt stöder protokollet för kontexthantering: när de används i enwith-sats stängs den nya filbeskrivaren automatiskt i slutet av blocket.Den nya filbeskrivaren är icke-ärftlig.
Ändrad i version 3.3: Parametern flags har lagts till.
Ändrad i version 3.4: Stöd för
with-satsen har lagts till. Den nya filbeskrivaren är nu inte ärftlig.Föråldrad sedan version 3.4: Parametern flags.
select.EPOLL_CLOEXECanvänds som standard nu. Användos.set_inheritable()för att göra filbeskrivaren ärftlig.
- select.poll()¶
(Stöds inte av alla operativsystem.) Returnerar ett polling-objekt, som stöder registrering och avregistrering av filbeskrivare och sedan polling av dem för I/O-händelser; se avsnitt Avstämningsobjekt nedan för de metoder som stöds av polling-objekt.
- select.kqueue()¶
(Stöds endast på BSD.) Returnerar ett kernel queue-objekt; se avsnitt Kqueue-objekt nedan för de metoder som stöds av kqueue-objekt.
Den nya filbeskrivaren är icke-ärftlig.
Ändrad i version 3.4: Den nya filbeskrivaren är nu inte ärftlig.
- select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶
(Stöds endast på BSD.) Returnerar ett kernel event-objekt; se avsnitt Kevent-objekt nedan för de metoder som stöds av kevent-objekt.
- select.select(rlist, wlist, xlist[, timeout])¶
Detta är ett enkelt gränssnitt till Unix
select()systemanrop. De tre första argumenten är iterabler av ”väntande objekt”: antingen heltal som representerar filbeskrivare eller objekt med en parameterlös metod med namnetfileno()som returnerar ett sådant heltal:rlist: vänta tills den är klar för läsning
wlist: vänta tills den är klar för skrivning
xlist: vänta på ett ”exceptionellt tillstånd” (se manualsidan för vad ditt system anser vara ett sådant tillstånd)
Tomma iterabler är tillåtna, men acceptansen av tre tomma iterabler är plattformsberoende. (Det är känt att den fungerar på Unix men inte på Windows.) Det valfria argumentet timeout anger en timeout som ett flyttal i sekunder. När argumentet timeout utelämnas blockerar funktionen tills minst en filbeskrivare är klar. Ett timeout-värde på noll anger en poll och blockerar aldrig.
Returvärdet är en trippel av listor med objekt som är klara: delmängder av de tre första argumenten. När tidsgränsen nås utan att en filbeskrivare har blivit klar returneras tre tomma listor.
Bland de acceptabla objekttyperna i iterablerna finns Python filobjekt (t.ex.
sys.stdin, eller objekt som returneras avopen()elleros.popen()), socketobjekt som returneras avsocket.socket(). Du kan också definiera en wrapper-klass själv, så länge den har en lämpligfileno()-metod (som verkligen returnerar en filbeskrivare, inte bara ett slumpmässigt heltal).Anteckning
Filobjekt på Windows är inte acceptabla, men sockets är det. I Windows tillhandahålls den underliggande funktionen
select()av WinSock-biblioteket och hanterar inte filbeskrivare som inte kommer från WinSock.Ändrad i version 3.5: Funktionen försöker nu igen med en omräknad timeout när den avbryts av en signal, utom om signalhanteraren gör ett undantag (se PEP 475 för motiveringen), istället för att göra
InterruptedError.
- select.PIPE_BUF¶
Det minsta antalet byte som kan skrivas utan blockering till en pipe när pipen har rapporterats som klar för skrivning av
select(),poll()eller ett annat gränssnitt i denna modul. Detta gäller inte för andra filliknande objekt som t.ex. sockets.Detta värde är garanterat av POSIX att vara minst 512.
Tillgänglighet: Unix
Tillagd i version 3.2.
/dev/poll Polling Objects¶
Solaris och dess derivat har /dev/poll. Medan select() är O(högsta filbeskrivare) och poll() är O(antal filbeskrivare), är /dev/poll O(aktiva filbeskrivare).
/dev/poll beteende är mycket nära standard poll() objektet.
- devpoll.close()¶
Stäng fildeskriptorn för polling-objektet.
Tillagd i version 3.4.
- devpoll.closed¶
Trueom polling-objektet är stängt.Tillagd i version 3.4.
- devpoll.fileno()¶
Returnera filbeskrivningsnumret för polling-objektet.
Tillagd i version 3.4.
- devpoll.register(fd[, eventmask])¶
Registrera en filbeskrivare med polling-objektet. Framtida anrop till metoden
poll()kommer sedan att kontrollera om filbeskrivaren har några väntande I/O-händelser. fd kan antingen vara ett heltal eller ett objekt med enfileno()-metod som returnerar ett heltal. Filobjekt implementerarfileno(), så de kan också användas som argument.eventmask är en valfri bitmask som beskriver vilken typ av händelser du vill söka efter. Konstanterna är desamma som för objektet
poll(). Standardvärdet är en kombination av konstanternaPOLLIN,POLLPRIochPOLLOUT.Varning
Att registrera en filbeskrivare som redan är registrerad är inte ett fel, men resultatet är odefinierat. Den lämpliga åtgärden är att avregistrera eller modifiera den först. Detta är en viktig skillnad jämfört med
poll().
- devpoll.modify(fd[, eventmask])¶
Denna metod gör en
unregister()följt av enregister(). Det är (lite) mer effektivt än att göra samma sak explicit.
- devpoll.unregister(fd)¶
Ta bort en filbeskrivare som spåras av ett polling-objekt. Precis som metoden
register()kan fd vara ett heltal eller ett objekt med en metodfileno()som returnerar ett heltal.Försök att ta bort en filbeskrivning som aldrig registrerats ignoreras på ett säkert sätt.
- devpoll.poll([timeout])¶
Undersöker uppsättningen av registrerade filbeskrivare och returnerar en eventuellt tom lista som innehåller
(fd, event)2-tuples för de beskrivare som har händelser eller fel att rapportera. fd är filbeskrivaren, och event är en bitmask med bitar inställda för de rapporterade händelserna för den beskrivaren —POLLINför väntande inmatning,POLLOUTför att ange att beskrivaren kan skrivas till, och så vidare. En tom lista indikerar att anropet timade ut och att inga filbeskrivare hade några händelser att rapportera. Om timeout anges, specificeras den tid i millisekunder som systemet ska vänta på händelser innan det återvänder. Om timeout utelämnas, -1, ellerNone, kommer anropet att blockeras tills det finns en händelse för detta poll-objekt.Ändrad i version 3.5: Funktionen försöker nu igen med en omräknad timeout när den avbryts av en signal, utom om signalhanteraren gör ett undantag (se PEP 475 för motiveringen), istället för att göra
InterruptedError.
Objekt för pollning av kant- och nivåtrigger (epoll)¶
https://linux.die.net/man/4/epoll
eventmask
Konstant
Betydelse
EPOLLINTillgänglig för läsning
EPOLLOUTTillgänglig för skrivning
EPOLLPRIBrådskande data för läsning
EPOLLERRFeltillstånd inträffade på assoc. fd
EPOLLHUPLägg på luren hände på assoc. fd
EPOLLETStäll in Edge Trigger-beteende, standard är Level Trigger-beteende
EPOLLONESHOTStäll in one-shot-beteende. Efter att en händelse har dragits ut är fd internt inaktiverad
EPOLLEXCLUSIVEVäck bara ett epoll-objekt när den associerade fd:n har en händelse. Standardinställningen (om denna flagga inte är inställd) är att väcka alla epoll-objekt som pollar på en fd.
EPOLLRDHUPStream socket peer stängde anslutningen eller stängde av skrivande halva av anslutningen.
EPOLLRDNORMMotsvarar
EPOLLIN
EPOLLRDBANDPrioriterat databand kan läsas.
EPOLLWRNORMMotsvarar
EPOLLOUT
EPOLLWRBANDPrioriterad data kan skrivas.
EPOLLMSGIgnorerad.
EPOLLWAKEUPFörhindrar sömn under väntan på händelse.
Tillagd i version 3.6:
EPOLLEXCLUSIVElades till. Det stöds endast av Linux Kernel 4.5 eller senare.Tillagd i version 3.14:
EPOLLWAKEUPhar lagts till. Det stöds endast av Linux Kernel 3.5 eller senare.
- epoll.close()¶
Stäng kontrollfilens deskriptor för epoll-objektet.
- epoll.closed¶
Trueom epoll-objektet är stängt.
- epoll.fileno()¶
Returnera filbeskrivningsnumret för kontrollen fd.
- epoll.fromfd(fd)¶
Skapa ett epoll-objekt från en given filbeskrivare.
- epoll.register(fd[, eventmask])¶
Registrera en fd-descriptor med epoll-objektet.
- epoll.modify(fd, eventmask)¶
Ändra en registrerad filbeskrivare.
- epoll.unregister(fd)¶
Ta bort en registrerad filbeskrivare från epoll-objektet.
Ändrad i version 3.9: Metoden ignorerar inte längre
EBADF-felet.
- epoll.poll(timeout=None, maxevents=-1)¶
Vänta på händelser. timeout i sekunder (float)
Ändrad i version 3.5: Funktionen försöker nu igen med en omräknad timeout när den avbryts av en signal, utom om signalhanteraren gör ett undantag (se PEP 475 för motiveringen), istället för att göra
InterruptedError.
Avstämningsobjekt¶
Systemanropet poll(), som stöds av de flesta Unix-system, ger bättre skalbarhet för nätverksservrar som betjänar många, många klienter samtidigt. poll() skalar bättre eftersom systemanropet bara behöver lista de filbeskrivare som är av intresse, medan select() bygger upp en bitmapp, slår på bitar för de intressanta filerna och sedan måste hela bitmappen skannas linjärt igen. select() är O(högsta filbeskrivare), medan poll() är O(antal filbeskrivare).
- poll.register(fd[, eventmask])¶
Registrera en filbeskrivare med polling-objektet. Framtida anrop till metoden
poll()kommer sedan att kontrollera om filbeskrivaren har några väntande I/O-händelser. fd kan antingen vara ett heltal eller ett objekt med enfileno()-metod som returnerar ett heltal. Filobjekt implementerarfileno(), så de kan också användas som argument.eventmask är en valfri bitmask som beskriver vilken typ av händelser du vill kontrollera för och kan vara en kombination av konstanterna
POLLIN,POLLPRIochPOLLOUT, som beskrivs i tabellen nedan. Om inget anges kommer standardvärdet att användas för att kontrollera alla 3 typerna av händelser.Konstant
Betydelse
POLLINDet finns data att läsa
POLLPRIDet finns brådskande uppgifter att läsa
POLLOUTKlar för utmatning: skrivning blockeras inte
POLLERRFeltillstånd av något slag
POLLHUPHängde upp
POLLRDHUPStream socket peer stängde anslutningen, eller stängde av skrivande halva av anslutningen
POLLNVALOgiltig begäran: descriptorn är inte öppen
Att registrera en filbeskrivare som redan är registrerad är inte ett fel, och har samma effekt som att registrera beskrivaren exakt en gång.
- poll.modify(fd, eventmask)¶
Ändrar en redan registrerad fd. Detta har samma effekt som
register(fd, eventmask). Försök att modifiera en filbeskrivare som aldrig registrerats orsakar ettOSErrorundantag med errnoENOENT.
- poll.unregister(fd)¶
Ta bort en filbeskrivare som spåras av ett polling-objekt. Precis som metoden
register()kan fd vara ett heltal eller ett objekt med en metodfileno()som returnerar ett heltal.Försök att ta bort en filbeskrivare som aldrig registrerats orsakar ett
KeyErrorundantag.
- poll.poll([timeout])¶
Undersöker uppsättningen av registrerade filbeskrivare och returnerar en eventuellt tom lista som innehåller
(fd, event)2-tuples för de beskrivare som har händelser eller fel att rapportera. fd är filbeskrivaren, och event är en bitmask med bitar inställda för de rapporterade händelserna för den beskrivaren —POLLINför väntande inmatning,POLLOUTför att ange att beskrivaren kan skrivas till, och så vidare. En tom lista indikerar att anropet timade ut och att inga filbeskrivare hade några händelser att rapportera. Om timeout anges, specificeras den tid i millisekunder som systemet ska vänta på händelser innan det återvänder. Om timeout utelämnas, är negativ ellerNone, kommer anropet att blockeras tills det finns en händelse för detta poll-objekt.Ändrad i version 3.5: Funktionen försöker nu igen med en omräknad timeout när den avbryts av en signal, utom om signalhanteraren gör ett undantag (se PEP 475 för motiveringen), istället för att göra
InterruptedError.
Kqueue-objekt¶
- kqueue.close()¶
Stäng kontrollfilens deskriptor för kqueue-objektet.
- kqueue.closed¶
Trueom kqueue-objektet är stängt.
- kqueue.fileno()¶
Returnera filbeskrivningsnumret för kontrollen fd.
- kqueue.fromfd(fd)¶
Skapa ett kqueue-objekt från en given filbeskrivning.
- kqueue.control(changelist, max_events[, timeout]) eventlist¶
Lågnivågränssnitt till kevent
changelist måste vara en iterabel av kevent-objekt eller
Nonemax_events måste vara 0 eller ett positivt heltal
timeout i sekunder (flytande värden är möjliga); standardvärdet är
None, att vänta för evigt
Ändrad i version 3.5: Funktionen försöker nu igen med en omräknad timeout när den avbryts av en signal, utom om signalhanteraren gör ett undantag (se PEP 475 för motiveringen), istället för att göra
InterruptedError.
Kevent-objekt¶
https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
- kevent.ident¶
Värde som används för att identifiera händelsen. Tolkningen beror på filtret men det är vanligtvis filbeskrivaren. I konstruktorn kan ident antingen vara en int eller ett objekt med en
fileno()-metod. kevent lagrar heltalet internt.
- kevent.filter¶
Namn på kernelfiltret.
Konstant
Betydelse
KQ_FILTER_READTar en descriptor och returnerar när det finns data tillgängliga att läsa
KQ_FILTER_WRITETar en descriptor och returnerar när det finns data tillgängliga att skriva
KQ_FILTER_AIOAIO-förfrågningar
KQ_FILTER_VNODEReturnerar när en eller flera av de begärda händelserna som bevakas i fflag inträffar
KQ_FILTER_PROCSe efter händelser på ett process-ID
KQ_FILTER_NETDEVHåll utkik efter händelser på en nätverksenhet [inte tillgängligt på macOS]
KQ_FILTER_SIGNALReturnerar när den bevakade signalen levereras till processen
KQ_FILTER_TIMERUpprättar en godtycklig timer
- kevent.flags¶
Filteråtgärd.
Konstant
Betydelse
KQ_EV_ADDLägger till eller ändrar en händelse
KQ_EV_DELETETar bort en händelse från kön
KQ_EV_ENABLETillåtercontrol() att returnera händelsen
KQ_EV_DISABLEAvaktiverar händelse
KQ_EV_ONESHOTTar bort händelse efter första förekomsten
KQ_EV_CLEARÅterställ tillståndet efter att en händelse har hämtats
KQ_EV_SYSFLAGSintern händelse
KQ_EV_FLAG1intern händelse
KQ_EV_EOFFilterspecifikt EOF-tillstånd
KQ_EV_ERRORSe returvärden
- kevent.fflags¶
Filtrera specifika flaggor.
KQ_FILTER_READochKQ_FILTER_WRITEfilterflaggor:Konstant
Betydelse
KQ_NOTE_LOWATlågvattenmärke för en socketbuffert
KQ_FILTER_VNODEfilterflaggor:Konstant
Betydelse
KQ_NOTE_DELETEunlink() anropades
KQ_NOTE_WRITEen skrivning inträffade
KQ_NOTE_EXTENDfilen förlängdes
KQ_NOTE_ATTRIBett attribut har ändrats
KQ_NOTE_LINKlänkantalet har ändrats
KQ_NOTE_RENAMEfilen döptes om
KQ_NOTE_REVOKEåtkomst till filen återkallades
KQ_FILTER_PROCfilterflaggor:Konstant
Betydelse
KQ_NOTE_EXITprocessen har avslutats
KQ_NOTE_FORKprocessen har anropat fork()
KQ_NOTE_EXECprocessen har exekverat en ny process
KQ_NOTE_PCTRLMASKintern filterflagga
KQ_NOTE_PDATAMASKintern filterflagga
KQ_NOTE_TRACKfölja en process över fork()
KQ_NOTE_CHILDreturneras på barnprocessen för NOTE_TRACK
KQ_NOTE_TRACKERRinte kan knyta an till ett barn
KQ_FILTER_NETDEVfilterflaggor (inte tillgängligt på macOS):Konstant
Betydelse
KQ_NOTE_LINKUPlänken är uppe
KQ_NOTE_LINKDOWNlänken är nere
KQ_NOTE_LINKINVlänkstatus är ogiltig
- kevent.data¶
Filtrera specifika data.
- kevent.udata¶
Användardefinierat värde.