asyncio — planificator de I/O asincron¶
Acest modul oferă un planificator cu multitasking cooperativ pentru corutinele async/await, împreună cu primitive pentru sincronizare (lacăte, evenimente) și lucru în rețea TCP neblocant prin cititoare și scriitoare de fluxuri. Sarcinile sunt rulate concurent pe o singură buclă de evenimente; sarcina aflată în curs de execuție cedează controlul înapoi buclei prin await.
Exemplu:
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)))
Funcții de bază¶
- asyncio.create_task(coro: Coroutine) Task¶
Creează o sarcină nouă din corutina dată și o planifică pentru execuție.
Returnează obiectul
Taskcorespunzător.
- asyncio.run(coro: Coroutine) Any¶
Creează o sarcină nouă din corutina dată și o rulează până la finalizare.
Returnează valoarea returnată de coro.
Funcții suplimentare¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
Așteaptă finalizarea obiectului awaitable, dar îl anulează dacă durează mai mult de timeout secunde. Dacă awaitable nu este o sarcină, atunci din el va fi creată o sarcină.
Dacă survine un timeout, sarcina este anulată și se ridică
asyncio.TimeoutError: acesta ar trebui interceptat de apelant. Sarcina primeșteasyncio.CancelledError, care poate fi ignorat sau interceptat folosindtry...exceptsautry...finallypentru a rula cod de curățare.Returnează valoarea de retur a lui awaitable.
Aceasta este o corutină.
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
Similar cu
wait_for(), dar timeout este un întreg exprimat în milisecunde.Aceasta este o corutină și o extensie MicroPython.
class Task¶
- class asyncio.Task¶
Acest obiect împachetează o corutină într-o sarcină în curs de execuție. Sarcinile pot fi așteptate folosind
await task, ceea ce va aștepta finalizarea sarcinii și va returna valoarea de retur a sarcinii.Sarcinile nu ar trebui create direct, ci mai degrabă folosind
create_task()pentru a le crea.
class Event¶
- class asyncio.Event¶
Creează un eveniment nou care poate fi folosit pentru sincronizarea sarcinilor. Evenimentele pornesc în starea ștearsă.
- set() None¶
Setează evenimentul. Orice sarcini care așteaptă evenimentul vor fi planificate pentru execuție.
Notă: aceasta trebuie apelată din interiorul unei sarcini. Nu este sigur să fie apelată dintr-o IRQ, dintr-o funcție de retroapelare (callback) a planificatorului sau din alt fir de execuție. Vezi
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Creează un fanion nou care poate fi folosit pentru sincronizarea unei sarcini cu cod care rulează în afara buclei asyncio, cum ar fi alte fire de execuție, IRQ-uri sau funcții de retroapelare (callback) ale planificatorului. Fanioanele pornesc în starea ștearsă.
- set() None¶
Setează fanionul. Dacă există o sarcină care așteaptă fanionul, aceasta va fi planificată pentru execuție.
class Lock¶
- class asyncio.Lock¶
Creează un lacăt nou care poate fi folosit pentru coordonarea sarcinilor. Lacătele pornesc în starea deblocată.
Pe lângă metodele de mai jos, lacătele pot fi folosite într-o instrucțiune
async with.
Conexiuni de flux TCP¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
Deschide o conexiune TCP către host și port date. Adresa host va fi rezolvată folosind
socket.getaddrinfo(), care în prezent este un apel blocant. Dacă ssl este un obiectssl.SSLContext, acest context este folosit pentru a crea transportul; dacă ssl esteTrue, este folosit un context implicit.Returnează o pereche de fluxuri: un flux cititor și un flux scriitor. Va ridica o eroare
OSErrorspecifică socket-ului dacă gazda nu a putut fi rezolvată sau dacă conexiunea nu a putut fi stabilită.Aceasta este o corutină.
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
Pornește un server TCP pe host și port date. Funcția callback va fi apelată pentru conexiunile primite și acceptate și i se vor transmite 2 argumente: fluxurile cititor și scriitor pentru conexiune.
Dacă ssl este un obiect
ssl.SSLContext, acest context este folosit pentru a crea transportul.Returnează un obiect
Server.Aceasta este o corutină.
- class asyncio.Stream¶
Aceasta reprezintă o conexiune de flux TCP. Pentru a minimiza codul, această clasă implementează atât un cititor, cât și un scriitor, iar atât
StreamReader, cât șiStreamWritersunt alias pentru această clasă.- get_extra_info(v: str) Any¶
Obține informații suplimentare despre flux, date de v. Valorile valide pentru v sunt:
peername.
- read(n: int = -1) bytes¶
Citește până la n octeți și îi returnează. Dacă n nu este furnizat sau este -1, atunci citește toți octeții până la EOF. Valoarea returnată va fi un obiect bytes gol dacă EOF este întâlnit înainte de citirea oricăror octeți.
Aceasta este o corutină.
- readinto(buf: bytearray | memoryview) int¶
Citește până la n octeți în buf, n fiind egal cu lungimea lui buf.
Returnează numărul de octeți citiți în buf.
Aceasta este o corutină și o extensie MicroPython.
- readexactly(n: int) bytes¶
Citește exact n octeți și îi returnează ca obiect bytes.
Ridică o excepție
EOFErrordacă fluxul se termină înainte de citirea a n octeți.Aceasta este o corutină.
- write(buf: bytes) None¶
Acumulează buf în tamponul de ieșire. Datele sunt golite doar atunci când este apelat
Stream.drain(). Se recomandă apelareaStream.drain()imediat după apelarea acestei funcții.
Bucla de evenimente¶
- asyncio.get_event_loop() Loop¶
Returnează bucla de evenimente folosită pentru planificarea și rularea sarcinilor. Vezi
Loop.
- asyncio.new_event_loop() Loop¶
Resetează bucla de evenimente și o returnează.
Notă: deoarece MicroPython are doar o singură buclă de evenimente, această funcție doar resetează starea buclei, nu creează una nouă.
- class asyncio.Loop¶
Aceasta reprezintă obiectul care planifică și rulează sarcinile. Nu poate fi creat; folosiți în schimb
get_event_loop().- run_until_complete(awaitable: Awaitable) Any¶
Rulează obiectul awaitable dat până la finalizare. Dacă awaitable nu este o sarcină, atunci va fi promovat la una.
- set_exception_handler(handler: Callable) None¶
Setează gestionarul de excepții care va fi apelat atunci când o sarcină ridică o excepție neinterceptată. handler ar trebui să accepte două argumente:
(loop, context).