select — odota tapahtumia joukossa virtoja

Tämä moduuli tarjoaa funktioita, joilla odotetaan tehokkaasti, kunnes yksi tai useampi virta (tiedostomainen olio, joka toteuttaa virtaprotokollan, kuten soketit, UART:t ja muut I/O-oliot) on valmis luettavaksi tai kirjoitettavaksi, sen sijaan että odotettaisiin kiireisesti tai estettäisiin suoritus yksittäisellä oliolla.

poll-olio on suositeltu rajapinta: se skaalautuu monille virroille ja on allokoinniton, kun sitä käytetään funktion poll.ipoll() kautta. Moduulitason funktio select() on vähemmän tehokas yhteensopivuusrajapinta.

Esimerkki poll-oliota käyttäen:

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())

Esimerkki moduulitason funktiota select() käyttäen:

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)

Funktiot

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

Odota, kunnes yksi tai useampi annetuista virtaolioista on valmis, tai kunnes timeout umpeutuu.

  • rlist on lista olioita, joiden luettavuutta valvotaan.

  • wlist on lista olioita, joiden kirjoitettavuutta valvotaan.

  • xlist on lista olioita, joiden virhe- tai katkostilaa valvotaan.

  • timeout on enimmäisaika, jonka odotetaan, sekunteina (liukuluku hyväksytään). Jos se jätetään pois tai on None, kutsu estää suorituksen rajattomasti; 0 palaa välittömästi (estoton kysely).

Palauttaa 3-monikon listoja (rlist, wlist, xlist). Jokainen palautettu lista on vastaavan syötelistan osajoukko, joka sisältää oliot, joista tuli valmiita luettaviksi, valmiita kirjoitettaviksi tai jotka ilmoittivat virheestä/katkoksesta. Jos timeout umpeutuu eikä mikään ole valmis, kaikki kolme listaa ovat tyhjiä.

Tämä funktio on vähemmän tehokas kuin poll (se rakentaa sisäisen kyselyjoukkonsa uudelleen jokaisella kutsulla); käytä poll-oliota sen sijaan, kun mahdollista.

Vakiot

select.POLLIN: int

Virrasta on dataa saatavilla luettavaksi.

select.POLLOUT: int

Virta voi ottaa vastaan lisää kirjoitettavaa dataa.

select.POLLERR: int

Virrassa tapahtui virhetilanne. Tämä on pyytämätön tapahtuma: sen ilmoittavat poll.poll() / poll.ipoll(), vaikka sitä ei pyydettäisi eventmask-arvossa, eikä sitä ole sallittua antaa syötteenä eventmask-arvossa.

select.POLLHUP: int

Virta katkesi / yhteys katkesi. Tämä on pyytämätön tapahtuma: sen ilmoittavat poll.poll() / poll.ipoll(), vaikka sitä ei pyydettäisi eventmask-arvossa, eikä sitä ole sallittua antaa syötteenä eventmask-arvossa.

Luokat

class select.poll

Luo kyselyolio, joka ylläpitää joukkoa rekisteröityjä virtoja (tai mitä tahansa virtaprotokollan paljastavia olioita) ja odottaa tehokkaasti, kunnes yhdestä tai useammasta tulee luettava, kirjoitettava tai se ilmoittaa poikkeustilanteesta.

Virrat lisätään funktiolla register(), poistetaan funktiolla unregister(), ja valvottavien tapahtumien joukkoa voidaan muuttaa funktiolla modify(). Kun olio on määritetty, kutsu funktiota poll() estääksesi suorituksen kunnes jokin on valmis (tai aikakatkaisu umpeutuu), tai funktiota ipoll() allokoinnittomaan iteraattoripohjaiseen muunnelmaan.

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

Rekisteröi virta obj kyselyä varten valvoen eventmask-arvon antamia tapahtumia (looginen TAI seuraavista):

eventmask-arvon oletus on select.POLLIN | select.POLLOUT.

select.POLLHUP ja select.POLLERR eivät ole kelvollisia syötteenä eventmask-arvossa – ne ovat pyytämättömiä tapahtumia, jotka poll() / ipoll() ilmoittavat riippumatta siitä, pyydettiinkö niitä (tämä vastaa POSIX-semantiikkaa).

Tätä metodia on sallittua kutsua useammin kuin kerran samalle obj-oliolle: myöhempi kutsu päivittää obj-olion tapahtumamaskin käyttäytyen kuten modify().

unregister(obj: Any) None

Poista obj rekisteröityjen virtojen joukosta. Sellaisen obj-olion poistaminen rekisteristä, jota ei ole tällä hetkellä rekisteröity, ei ole virhe (kutsulla ei ole tällöin vaikutusta).

modify(obj: Any, eventmask: int) None

Muuta jo rekisteröidyn obj-olion tapahtumamaski arvoon eventmask. Nostaa poikkeuksen OSError virheellä errno.ENOENT, jos obj ei ole rekisteröity.

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

Estä suoritus, kunnes vähintään yksi rekisteröity virta tulee valmiiksi tai ilmoittaa poikkeustilanteesta, ja palauta sitten lista virroista, jotka laukesivat.

timeout on enimmäisaika, jonka odotetaan millisekunteina. Jos se jätetään pois tai on -1, kutsu estää suorituksen rajattomasti; 0 palaa välittömästi (estoton kysely).

Palauttaa listan (obj, event, ...)-monikoita, yhden kutakin laukennutta virtaa kohden. obj on rekisteröity virta ja event on tapahtuneiden lippujen select.POLLIN / select.POLLOUT / select.POLLERR / select.POLLHUP bittikohtainen TAI. Jokainen monikko voi sisältää lisäksi toteutuskohtaisia elementtejä, joten älä oleta pituuden olevan täsmälleen 2. Jos timeout umpeutuu eikä mikään ole valmis, palautetaan tyhjä lista.

select.POLLHUP ja select.POLLERR voidaan palauttaa milloin tahansa (vaikka niitä ei pyydetty), ja niihin on reagoitava – tyypillisesti poistamalla rekisteristä ja sulkemalla kyseinen virta – muuten myöhemmät kutsut palaavat jatkuvasti välittömästi nämä liput asetettuina kyseiselle virralle.

Mahdolliset vireillä olevat ajastetut takaisinkutsut suoritetaan taatusti ennen kyselysilmukkaan siirtymistä.

Ero CPythoniin

Palautetut monikot voivat sisältää enemmän kuin 2 elementtiä, kuten edellä on kuvattu.

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

Kuten poll(), mutta listan rakentamisen sijaan se palauttaa iteraattorin, joka tuottaa yhden (obj, event, ...)-monikon kerrallaan. Tämä välttää allokoinnin jokaisella kutsulla, mikä on tärkeää asynkronisille I/O-ajoittajille.

Tuotettu monikko on kutsuttavan omistama: se käytetään uudelleen (ylikirjoitetaan) seuraavalla iteraatiolla, joten sen sisältö on kulutettava silmukan rungon sisällä eikä viittauksia siihen saa tallentaa.

timeout-arvolla on sama merkitys kuin funktiossa poll(). Jos flags on 1, käytetään kertalaukaisukäyttäytymistä: virran, jonka tapahtuma laukesi, tapahtumamaski tyhjennetään automaattisesti (vastaa muotoa poll.modify(obj, 0)), joten sille ei ilmoiteta enempää tapahtumia, ennen kuin sen maski asetetaan uudelleen funktiolla modify().

Mahdolliset vireillä olevat ajastetut takaisinkutsut suoritetaan taatusti ennen kyselysilmukkaan siirtymistä.

Ero CPythoniin

Tämä metodi on MicroPython-laajennus.