asyncio — asinkroni I/O planer¶
Ovaj modul pruža planer za kooperativni višezadaćni rad namijenjen async/await korutinama, zajedno s primitivima za sinkronizaciju (brave, događaji) i neblokirajuće TCP umrežavanje putem čitača i pisača tokova podataka. Zadaci se izvode istovremeno na jednoj petlji događaja; trenutačno aktivni zadatak vraća kontrolu petlji pomoću await.
Primjer:
import asyncio
async def blink(led, period_ms):
while True:
led.on()
await asyncio.sleep_ms(5)
led.off()
await asyncio.sleep_ms(period_ms)
async def main(led1, led2):
asyncio.create_task(blink(led1, 700))
asyncio.create_task(blink(led2, 400))
await asyncio.sleep_ms(10_000)
# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))
Osnovne funkcije¶
- asyncio.create_task(coro: Coroutine) Task¶
Stvara novi zadatak iz zadane korutine i raspoređuje ga za izvođenje.
Vraća odgovarajući
Taskobjekt.
- asyncio.run(coro: Coroutine) Any¶
Stvara novi zadatak iz zadane korutine i izvodi ga dok se ne dovrši.
Vraća vrijednost koju vraća coro.
Dodatne funkcije¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
Čeka da se awaitable dovrši, ali ga otkazuje ako traje dulje od timeout sekundi. Ako awaitable nije zadatak, iz njega će se stvoriti zadatak.
Ako dođe do isteka vremena, otkazuje zadatak i podiže
asyncio.TimeoutError: to bi pozivatelj trebao uhvatiti. Zadatak primaasyncio.CancelledErrorkoji se može zanemariti ili uhvatiti pomoćutry...exceptilitry...finallyza izvođenje koda za čišćenje.Vraća povratnu vrijednost awaitable.
Ovo je korutina.
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
Slično kao
wait_for(), ali je timeout cijeli broj u milisekundama.Ovo je korutina i MicroPython proširenje.
class Task¶
- class asyncio.Task¶
Ovaj objekt omata korutinu u aktivni zadatak. Na zadatke se može čekati pomoću
await task, što će pričekati da se zadatak dovrši i vratiti povratnu vrijednost zadatka.Zadaci se ne bi trebali stvarati izravno, nego se za njihovo stvaranje koristi
create_task().
class Event¶
- class asyncio.Event¶
Stvara novi događaj koji se može koristiti za sinkronizaciju zadataka. Događaji počinju u poništenom stanju.
- set() None¶
Postavlja događaj. Svi zadaci koji čekaju na događaj bit će raspoređeni za izvođenje.
Napomena: Ovo se mora pozvati unutar zadatka. Nije sigurno pozvati to iz IRQ-a, povratnog poziva planera ili druge dretve. Pogledajte
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Stvara novu zastavicu koja se može koristiti za sinkronizaciju zadatka s kodom koji se izvodi izvan asyncio petlje, poput drugih dretvi, IRQ-ova ili povratnih poziva planera. Zastavice počinju u poništenom stanju.
- set() None¶
Postavlja zastavicu. Ako neki zadatak čeka na zastavicu, bit će raspoređen za izvođenje.
class Lock¶
- class asyncio.Lock¶
Stvara novu bravu koja se može koristiti za koordinaciju zadataka. Brave počinju u otključanom stanju.
Osim dolje navedenih metoda, brave se mogu koristiti u
async withnaredbi.
TCP veze tokova podataka¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
Otvara TCP vezu prema zadanom host i port. Adresa host razriješit će se pomoću
socket.getaddrinfo(), što je trenutačno blokirajući poziv. Ako je ssl objektssl.SSLContext, taj se kontekst koristi za stvaranje transporta; ako je sslTrue, koristi se zadani kontekst.Vraća par tokova podataka: čitač i pisač. Podići će
OSErrorspecifičan za utičnicu ako se host nije mogao razriješiti ili ako se veza nije mogla uspostaviti.Ovo je korutina.
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
Pokreće TCP poslužitelj na zadanom host i port. callback će se pozvati s dolaznim, prihvaćenim vezama te će mu se proslijediti 2 argumenta: čitač i pisač tokova podataka za vezu.
Ako je ssl objekt
ssl.SSLContext, taj se kontekst koristi za stvaranje transporta.Vraća
Serverobjekt.Ovo je korutina.
- class asyncio.Stream¶
Ovo predstavlja TCP vezu toka podataka. Kako bi se smanjila količina koda, ova klasa implementira i čitač i pisač, a i
StreamReaderiStreamWritersu alias za ovu klasu.- get_extra_info(v: str) Any¶
Dohvaća dodatne informacije o toku podataka, zadane putem v. Valjane vrijednosti za v su:
peername.
- read(n: int = -1) bytes¶
Čita do n bajtova i vraća ih. Ako n nije naveden ili je -1, čita sve bajtove do EOF-a. Vraćena vrijednost bit će prazan bytes objekt ako se EOF dosegne prije nego što se pročita ijedan bajt.
Ovo je korutina.
- readinto(buf: bytearray | memoryview) int¶
Čita do n bajtova u buf, pri čemu je n jednak duljini buf.
Vraća broj bajtova pročitanih u buf.
Ovo je korutina i MicroPython proširenje.
- readexactly(n: int) bytes¶
Čita točno n bajtova i vraća ih kao bytes objekt.
Podiže iznimku
EOFErrorako tok podataka završi prije čitanja n bajtova.Ovo je korutina.
- write(buf: bytes) None¶
Nakuplja buf u izlazni međuspremnik. Podaci se prazne tek kada se pozove
Stream.drain(). Preporučuje se pozvatiStream.drain()odmah nakon poziva ove funkcije.
Petlja događaja¶
- asyncio.get_event_loop() Loop¶
Vraća petlju događaja koja se koristi za raspoređivanje i izvođenje zadataka. Pogledajte
Loop.
- asyncio.new_event_loop() Loop¶
Ponovno postavlja petlju događaja i vraća je.
Napomena: budući da MicroPython ima samo jednu petlju događaja, ova funkcija samo ponovno postavlja stanje petlje, ne stvara novu.
- class asyncio.Loop¶
Ovo predstavlja objekt koji raspoređuje i izvodi zadatke. Ne može se stvoriti, umjesto toga koristite
get_event_loop().- run_until_complete(awaitable: Awaitable) Any¶
Izvodi zadani awaitable dok se ne dovrši. Ako awaitable nije zadatak, promaknut će se u zadatak.
- set_exception_handler(handler: Callable) None¶
Postavlja rukovatelja iznimkama koji se poziva kada zadatak podigne iznimku koja nije uhvaćena. handler bi trebao prihvaćati dva argumenta:
(loop, context).