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 Task objekt.

asyncio.current_task() Task

Vraća Task objekt povezan s trenutačno aktivnim zadatkom.

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.

asyncio.sleep(t: float) None

Spava t sekundi (može biti decimalni broj).

Ovo je korutina.

asyncio.sleep_ms(t: int) None

Spava t milisekundi.

Ovo je korutina i MicroPython proširenje.

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 prima asyncio.CancelledError koji se može zanemariti ili uhvatiti pomoću try...except ili try...finally za 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.

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

Izvodi sve awaitables istovremeno. Svi awaitables koji nisu zadaci promiču se u zadatke.

Vraća popis povratnih vrijednosti svih awaitables.

Ovo je korutina.

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

cancel() None

Otkazuje zadatak ubacivanjem asyncio.CancelledError u njega. Zadatak može zanemariti tu iznimku. Kod za čišćenje može se izvesti hvatanjem iznimke ili pomoću try ... finally.

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.

is_set() bool

Vraća True ako je događaj postavljen, inače False.

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.

clear() None

Poništava događaj.

wait() None

Čeka da se događaj postavi. Ako je događaj već postavljen, odmah se vraća.

Ovo je korutina.

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.

clear() None

Poništava zastavicu. Ovo se može koristiti kako bi se osiguralo da je možda prethodno postavljena zastavica poništena prije čekanja na nju.

wait() None

Čeka da se zastavica postavi. Ako je zastavica već postavljena, odmah se vraća. Zastavica se automatski poništava nakon povratka iz wait.

Na zastavicu može čekati samo jedan zadatak istovremeno.

Ovo je korutina.

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 with naredbi.

locked() bool

Vraća True ako je brava zaključana, inače False.

acquire() bool

Čeka da brava bude u otključanom stanju, a zatim je zaključava na atomičan način. Samo jedan zadatak može steći bravu u bilo kojem trenutku.

Ovo je korutina.

release() None

Otpušta bravu. Ako neki zadaci čekaju na bravu, sljedeći u redu raspoređuje se za izvođenje, a brava ostaje zaključana. U suprotnom, nijedan zadatak ne čeka i brava postaje otključana.

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 objekt ssl.SSLContext, taj se kontekst koristi za stvaranje transporta; ako je ssl True, koristi se zadani kontekst.

Vraća par tokova podataka: čitač i pisač. Podići će OSError specifič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 Server objekt.

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 StreamReader i StreamWriter su 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.

close() None

Zatvara tok podataka.

wait_closed() None

Čeka da se tok podataka zatvori.

Ovo je korutina.

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 EOFError ako tok podataka završi prije čitanja n bajtova.

Ovo je korutina.

readline() bytes

Čita redak i vraća ga.

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 pozvati Stream.drain() odmah nakon poziva ove funkcije.

drain() None

Prazni (zapisuje) sve međuspremljene izlazne podatke u tok podataka.

Ovo je korutina.

class asyncio.Server

Ovo predstavlja klasu poslužitelja koju vraća start_server(). Može se koristiti u async with naredbi za zatvaranje poslužitelja pri izlazu.

close() None

Zatvara poslužitelj.

wait_closed() None

Čeka da se poslužitelj zatvori.

Ovo je korutina.

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

create_task(coro: Coroutine) Task

Stvara zadatak iz zadanog coro i vraća novi Task objekt.

run_forever() None

Izvodi petlju događaja dok se ne pozove stop().

run_until_complete(awaitable: Awaitable) Any

Izvodi zadani awaitable dok se ne dovrši. Ako awaitable nije zadatak, promaknut će se u zadatak.

stop() None

Zaustavlja petlju događaja.

close() None

Zatvara petlju događaja.

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

get_exception_handler() Callable | None

Dohvaća trenutačnog rukovatelja iznimkama. Vraća rukovatelja ili None ako prilagođeni rukovatelj nije postavljen.

default_exception_handler(context: dict) None

Zadani rukovatelj iznimkama koji se poziva.

call_exception_handler(context: dict) None

Poziva trenutačnog rukovatelja iznimkama. Argument context prosljeđuje se kroz i predstavlja rječnik koji sadrži ključeve: 'message', 'exception', 'future'.