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 Task corespunzător.

asyncio.current_task() Task#

Returnează obiectul Task asociat sarcinii aflate în curs de execuție.

asyncio.run(coro: Coroutine) Any#

Creează o sarcină nouă din corutina dată și o rulează până la finalizare.

Returnează valoarea returnată de coro.

asyncio.sleep(t: float) None#

Adoarme timp de t secunde (poate fi un float).

Aceasta este o corutină.

asyncio.sleep_ms(t: int) None#

Adoarme timp de t milisecunde.

Aceasta este o corutină și o extensie MicroPython.

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ște asyncio.CancelledError, care poate fi ignorat sau interceptat folosind try...except sau try...finally pentru 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.

asyncio.gather(*awaitables, return_exceptions: bool = False) List#

Rulează concurent toate obiectele awaitables. Orice awaitables care nu sunt sarcini sunt promovate la sarcini.

Returnează o listă cu valorile de retur ale tuturor obiectelor awaitables.

Aceasta este o corutină.

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.

cancel() None#

Anulează sarcina prin injectarea în ea a asyncio.CancelledError. Sarcina poate ignora această excepție. Codul de curățare poate fi rulat prin interceptarea ei sau prin try ... finally.

class Event#

class asyncio.Event#

Creează un eveniment nou care poate fi folosit pentru sincronizarea sarcinilor. Evenimentele pornesc în starea ștearsă.

is_set() bool#

Returnează True dacă evenimentul este setat, False în caz contrar.

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.

clear() None#

Șterge evenimentul.

wait() None#

Așteaptă ca evenimentul să fie setat. Dacă evenimentul este deja setat, atunci revine imediat.

Aceasta este o corutină.

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.

clear() None#

Șterge fanionul. Acest lucru poate fi folosit pentru a asigura că un fanion posibil setat anterior este șters înainte de a-l aștepta.

wait() None#

Așteaptă ca fanionul să fie setat. Dacă fanionul este deja setat, atunci revine imediat. Fanionul este resetat automat la revenirea din wait.

Un fanion poate fi așteptat doar de o singură sarcină la un moment dat.

Aceasta este o corutină.

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.

locked() bool#

Returnează True dacă lacătul este blocat, altfel False.

acquire() bool#

Așteaptă ca lacătul să fie în starea deblocată și apoi îl blochează în mod atomic. Doar o singură sarcină poate dobândi lacătul la un moment dat.

Aceasta este o corutină.

release() None#

Eliberează lacătul. Dacă există sarcini care așteaptă lacătul, atunci următoarea din coadă este planificată pentru execuție, iar lacătul rămâne blocat. În caz contrar, nu există sarcini în așteptare și lacătul devine deblocat.

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 obiect ssl.SSLContext, acest context este folosit pentru a crea transportul; dacă ssl este True, este folosit un context implicit.

Returnează o pereche de fluxuri: un flux cititor și un flux scriitor. Va ridica o eroare OSError specifică 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 și StreamWriter sunt 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.

close() None#

Închide fluxul.

wait_closed() None#

Așteaptă ca fluxul să se închidă.

Aceasta este o corutină.

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 EOFError dacă fluxul se termină înainte de citirea a n octeți.

Aceasta este o corutină.

readline() bytes#

Citește o linie și o returnează.

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ă apelarea Stream.drain() imediat după apelarea acestei funcții.

drain() None#

Golește (scrie) toate datele de ieșire stocate în tampon către flux.

Aceasta este o corutină.

class asyncio.Server#

Aceasta reprezintă clasa server returnată de start_server(). Poate fi folosită într-o instrucțiune async with pentru a închide serverul la ieșire.

close() None#

Închide serverul.

wait_closed() None#

Așteaptă ca serverul să se închidă.

Aceasta este o corutină.

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

create_task(coro: Coroutine) Task#

Creează o sarcină din coro dat și returnează noul obiect Task.

run_forever() None#

Rulează bucla de evenimente până când este apelat stop().

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.

stop() None#

Oprește bucla de evenimente.

close() None#

Închide bucla de evenimente.

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

get_exception_handler() Callable | None#

Obține gestionarul de excepții curent. Returnează gestionarul sau None dacă nu este setat niciun gestionar personalizat.

default_exception_handler(context: dict) None#

Gestionarul de excepții implicit care este apelat.

call_exception_handler(context: dict) None#

Apelează gestionarul de excepții curent. Argumentul context este transmis mai departe și este un dicționar care conține cheile: 'message', 'exception', 'future'.