8.13. Silmukan hallinta

Useimmat asyncio-skriptit eivät koskaan kosketa tapahtumasilmukkaa suoraan – asyncio.run() riittää. Tämä sivu käsittelee Loop -rajapintaa niitä tapauksia varten, joissa se ei riitä: poikkeuskäsittelijän asentaminen, silmukan suorittaminen eri elinkaarella kuin run tai silmukkaobjektin säilyttäminen instrumentointia varten.

8.13.1. Silmukan hakeminen

  • asyncio.get_event_loop() – palauttaa Loop -objektin. Turvallinen kutsua korutiinin sisältä tai ulkopuolelta.

  • asyncio.new_event_loop() – MicroPythonissa nollaa olemassa olevan silmukan tilan sen sijaan, että loisi uuden. Huomautus kannattaa toistaa: ohjelmaa kohden on tasan yksi tapahtumasilmukka.

Silmukan suorittamiseen ei ole muuta API:a kuin Loop -luokan metodit ja asyncio.run().

8.13.2. Silmukan suorittaminen suoraan

asyncio.run() on oikea aloituspiste lähes jokaiselle sovellukselle. Kaksi Loop -metodia on olemassa niitä tapauksia varten, joissa se ei ole.

  • run_until_complete() – annetulla odotettavalla suorita silmukkaa, kunnes kyseinen odotettava valmistuu, ja palauta sitten sen tulos. Vastaa yhtä asyncio.run() -kutsua ilman silmukan purkua.

  • run_forever() – suorita silmukkaa, kunnes stop() kutsutaan tehtävän sisältä. Ei ylätason odotettavaa; sovelluksen odotetaan ajastavan tarvitsemansa asyncio.create_task() -funktiolla ennen run_forever -kutsua.

Vastaavat metodit ovat stop() (pyydä silmukkaa pysähtymään nykyisen tehtävän valmistuttua) ja close() (vapauta silmukan resurssit).

8.13.3. Tehtävien luonti silmukan puolelta

  • create_task() – sama toiminto kuin asyncio.create_task(). Vapaa funktio on olemassa, jotta sovelluskoodi ei tarvitse silmukkaviittausta tavalliseen tapaukseen; metodi on olemassa instrumentointia varten, jolla sellainen jo on.

8.13.4. Poikkeuskäsittelijät

Silmukka kutsuu käsittelijää, kun tehtävä nostaa poikkeuksen, jota mikään korutiinikutsuketjussa ei ole napannut – tyypillinen tapaus on tehtävä, jonka sovellus loi asyncio.create_task() -funktiolla eikä koskaan odottanut. Oletuskäsittelijä tulostaa jäljitysjäljen sys.stderr -kanavan kautta; poikkeukset -sivu näytti, miten sen voi vaihtaa johonkin mukautettuun.

  • set_exception_handler() – asenna mukautettu käsittelijä. Käsittelijä on kutsuttava handler(loop, context), jossa context on sanakirja, jossa on vähintään 'message' ja yleensä 'exception' ja 'future'.

  • get_exception_handler() – palauttaa parhaillaan asennetun käsittelijän tai None, jos oletus on käytössä.

  • default_exception_handler() – sisäänrakennettu käsittelijä. Hyödyllinen mukautetun käsittelijän sisällä, joka haluaa myös suorittaa oletustoiminnon (kirjata flash-muistiin ja tulostaa jäljitysjäljen, esimerkiksi).

  • call_exception_handler() – suorita parhaillaan asennettu käsittelijä käsin rakennetulla kontekstisanakirjalla. Käyttää enimmäkseen silmukka itse; sovellus tarvitsee sitä harvoin.