8.3. Tapahtumasilmukka¶
Tapahtumasilmukka on se moottori, jota asyncio ajaa allaan. Se pitää listaa jokaisesta ohjelman tehtävästä, pyytää kutakin niistä suorittamaan kunnes kyseisen tehtävän seuraava await, ja siirtyy seuraavaan valmiina olevaan tehtävään. Kun valmiina olevia tehtäviä ei ole, se odottaa – itse odotus on se, mikä tekee suorittimen käytettäväksi muille laiteohjelmiston asioille ja virransäästöunille – kunnes jokin, mitä tehtävä odotti, tulee saataville, ja jatkaa sitten kyseistä tehtävää. Toista ikuisesti.
Useimmat sovellukset eivät koskaan ole suoraan vuorovaikutuksessa silmukan kanssa. Silmukka on seuraus asyncio.run() -funktion kutsumisesta; sovellus kirjoittaa korutiineja, ajoittaa ne tehtävinä, ja silmukka hoitaa loput.
8.3.1. Mitä asyncio.run() todella tekee¶
Yksi kutsu:
asyncio.run(main())
on lyhenne pidemmälle sarjalle, jonka silmukka hoitaa sovelluksen puolesta:
Luo tapahtumasilmukka, jos sitä ei vielä ole olemassa.
Kääri annettu korutiini tehtävään ja ajoita se silmukan ylimmän tason aloituspisteeksi.
Aja silmukkaa – käy läpi valmiit tehtävät, odota kun mikään ei ole valmis, jatka tehtäviä kun niiden awaitit valmistuvat – kunnes ylimmän tason tehtävä palaa tai nostaa poikkeuksen.
Peruuta kaikki sovelluksen luomat tehtävät, jotka ovat vielä käynnissä.
Palauta se mitä ylimmän tason korutiini palautti (tai nosta uudelleen se mitä se nosti).
8.3.2. Yksi silmukka per ohjelma¶
MicroPythonin asynciossa on yksi tapahtumasilmukka, piste. Tuoreen silmukan luomista ei ole, eikä yhden silmukan sisäkkäistämistä toisen sisään ole. asyncio.run() -funktion kutsuminen sellaisen korutiinin sisältä, joka on jo käynnissä silmukassa, on virhe; silmukka on jo siellä, ja korutiinin tarvitsee vain awaitata sitä mitä se halusi käynnistää.
Käytännössä sääntö on sama kuin edellisen sivun loppurivi: ohjelmaa kohden on tasan yksi asyncio.run() -kutsu, ylhäällä, jonka takana on yksi async def main(). Kaikki muu elää main:n sisällä.
8.3.3. Suora silmukan käyttö¶
Niitä harvinaisia tapauksia varten, joissa sovelluksen on kosketettava itse silmukkaa – enimmäkseen diagnostiikkaa ja poikkeuskäsittelijöitä – asyncio.get_event_loop() palauttaa Loop -objektin. Sieltä käsin sovellus voi asentaa mukautetun poikkeuskäsittelijän, tarkastella mitä silmukka tekee, tai (hyvin satunnaisesti) kutsua create_task() -metodia suoraan asyncio.create_task() -funktion sijaan (ne ovat sama operaatio).
Koko se metodijoukko, jonka Loop paljastaa – run_forever(), stop(), set_exception_handler() ja loput – käsitellään silmukan hallinta -sivulla myöhemmin tässä osiossa. Siihen asti asyncio.run(main()) on kaikki, mitä sovellus tarvitsee.