asyncio — asynchronní I/O plánovač

Tento modul poskytuje plánovač pro kooperativní multitasking pro async/await korutiny, spolu s primitivy pro synchronizaci (zámky, události) a neblokující TCP síťování prostřednictvím proudových čtecích a zapisovacích objektů. Úlohy jsou spouštěny souběžně na jediné smyčce událostí; aktuálně běžící úloha vrací řízení zpět smyčce pomocí await.

Příklad:

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

Základní funkce

asyncio.create_task(coro: Coroutine) Task

Vytvoří novou úlohu z dané korutiny a naplánuje její spuštění.

Vrátí odpovídající objekt Task.

asyncio.current_task() Task

Vrátí objekt Task přidružený k aktuálně běžící úloze.

asyncio.run(coro: Coroutine) Any

Vytvoří novou úlohu z dané korutiny a spustí ji, dokud se nedokončí.

Vrátí hodnotu vrácenou coro.

asyncio.sleep(t: float) None

Uspí na t sekund (může být float).

Toto je korutina.

asyncio.sleep_ms(t: int) None

Uspí na t milisekund.

Toto je korutina a rozšíření MicroPythonu.

Doplňkové funkce

asyncio.wait_for(awaitable: Awaitable, timeout: float) Any

Čeká na dokončení awaitable, ale zruší jej, pokud trvá déle než timeout sekund. Pokud awaitable není úloha, bude z něj úloha vytvořena.

Pokud dojde k vypršení časového limitu, úloha je zrušena a vyvolá se asyncio.TimeoutError: ten by měl být zachycen volajícím. Úloha obdrží asyncio.CancelledError, který lze ignorovat nebo zachytit pomocí try...except nebo try...finally pro spuštění úklidového kódu.

Vrátí návratovou hodnotu awaitable.

Toto je korutina.

asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any

Podobné jako wait_for(), ale timeout je celé číslo v milisekundách.

Toto je korutina a rozšíření MicroPythonu.

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

Spustí všechny awaitables souběžně. Jakékoli awaitables, které nejsou úlohami, jsou povýšeny na úlohy.

Vrátí seznam návratových hodnot všech awaitables.

Toto je korutina.

class Task

class asyncio.Task

Tento objekt obaluje korutinu do běžící úlohy. Na úlohy lze čekat pomocí await task, což počká na dokončení úlohy a vrátí její návratovou hodnotu.

Úlohy by neměly být vytvářeny přímo, místo toho použijte k jejich vytvoření create_task().

cancel() None

Zruší úlohu vložením asyncio.CancelledError do ní. Úloha může tuto výjimku ignorovat. Úklidový kód lze spustit jejím zachycením nebo pomocí try ... finally.

class Event

class asyncio.Event

Vytvoří novou událost, kterou lze použít k synchronizaci úloh. Události začínají ve vymazaném stavu.

is_set() bool

Vrátí True, pokud je událost nastavena, jinak False.

set() None

Nastaví událost. Všechny úlohy čekající na událost budou naplánovány ke spuštění.

Poznámka: Toto musí být voláno z úlohy. Není bezpečné volat to z IRQ, callbacku plánovače nebo jiného vlákna. Viz ThreadSafeFlag.

clear() None

Vymaže událost.

wait() None

Čeká na nastavení události. Pokud je událost již nastavena, vrátí se okamžitě.

Toto je korutina.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

Vytvoří nový příznak, který lze použít k synchronizaci úlohy s kódem běžícím mimo asyncio smyčku, jako jsou jiná vlákna, IRQ nebo callbacky plánovače. Příznaky začínají ve vymazaném stavu.

set() None

Nastaví příznak. Pokud na příznak čeká úloha, bude naplánována ke spuštění.

clear() None

Vymaže příznak. Toto lze použít k zajištění, že případně dříve nastavený příznak je vymazán před čekáním na něj.

wait() None

Čeká na nastavení příznaku. Pokud je příznak již nastaven, vrátí se okamžitě. Příznak je při návratu z wait automaticky resetován.

Na příznak může čekat vždy pouze jedna úloha.

Toto je korutina.

class Lock

class asyncio.Lock

Vytvoří nový zámek, který lze použít ke koordinaci úloh. Zámky začínají v odemčeném stavu.

Kromě níže uvedených metod lze zámky použít v příkazu async with.

locked() bool

Vrátí True, pokud je zámek zamčen, jinak False.

acquire() bool

Čeká, dokud zámek nebude v odemčeném stavu, a poté jej atomickým způsobem zamkne. Zámek může v jeden okamžik získat pouze jedna úloha.

Toto je korutina.

release() None

Uvolní zámek. Pokud na zámek čekají nějaké úlohy, je naplánováno spuštění další úlohy ve frontě a zámek zůstává zamčen. Jinak žádné úlohy nečekají a zámek se stane odemčeným.

TCP proudová spojení

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]

Otevře TCP spojení k danému host a port. Adresa host bude přeložena pomocí socket.getaddrinfo(), což je v současnosti blokující volání. Pokud je ssl objektem ssl.SSLContext, je tento kontext použit k vytvoření transportu; pokud je ssl True, použije se výchozí kontext.

Vrátí dvojici proudů: čtecí a zapisovací proud. Vyvolá OSError specifický pro socket, pokud nebylo možné host přeložit nebo pokud nebylo možné navázat spojení.

Toto je korutina.

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server

Spustí TCP server na daném host a port. callback bude volán s příchozími, přijatými spojeními a budou mu předány 2 argumenty: čtecí a zapisovací proud pro spojení.

Pokud je ssl objektem ssl.SSLContext, je tento kontext použit k vytvoření transportu.

Vrátí objekt Server.

Toto je korutina.

class asyncio.Stream

Toto představuje TCP proudové spojení. Aby se minimalizoval kód, tato třída implementuje jak čtecí, tak zapisovací objekt a jak StreamReader, tak StreamWriter jsou aliasy na tuto třídu.

get_extra_info(v: str) Any

Získá dodatečné informace o proudu zadané pomocí v. Platné hodnoty pro v jsou: peername.

close() None

Zavře proud.

wait_closed() None

Čeká na uzavření proudu.

Toto je korutina.

read(n: int = -1) bytes

Přečte až n bajtů a vrátí je. Pokud n není zadáno nebo je -1, přečte všechny bajty až do EOF. Vrácená hodnota bude prázdný objekt bytes, pokud je EOF dosaženo před přečtením jakýchkoli bajtů.

Toto je korutina.

readinto(buf: bytearray | memoryview) int

Přečte až n bajtů do buf, přičemž n je rovno délce buf.

Vrátí počet bajtů přečtených do buf.

Toto je korutina a rozšíření MicroPythonu.

readexactly(n: int) bytes

Přečte přesně n bajtů a vrátí je jako objekt bytes.

Vyvolá výjimku EOFError, pokud proud skončí před přečtením n bajtů.

Toto je korutina.

readline() bytes

Přečte řádek a vrátí jej.

Toto je korutina.

write(buf: bytes) None

Připojí buf do výstupního bufferu. Data jsou vyprázdněna teprve při volání Stream.drain(). Doporučuje se zavolat Stream.drain() ihned po volání této funkce.

drain() None

Vyprázdní (zapíše) všechna bufferovaná výstupní data do proudu.

Toto je korutina.

class asyncio.Server

Toto představuje třídu serveru vrácenou z start_server(). Lze ji použít v příkazu async with k uzavření serveru při ukončení.

close() None

Zavře server.

wait_closed() None

Čeká na uzavření serveru.

Toto je korutina.

Smyčka událostí

asyncio.get_event_loop() Loop

Vrátí smyčku událostí používanou k plánování a spouštění úloh. Viz Loop.

asyncio.new_event_loop() Loop

Resetuje smyčku událostí a vrátí ji.

Poznámka: protože MicroPython má pouze jedinou smyčku událostí, tato funkce pouze resetuje stav smyčky, nevytváří novou.

class asyncio.Loop

Toto představuje objekt, který plánuje a spouští úlohy. Nelze jej vytvořit, místo toho použijte get_event_loop().

create_task(coro: Coroutine) Task

Vytvoří úlohu z daného coro a vrátí nový objekt Task.

run_forever() None

Spustí smyčku událostí, dokud není zavolána stop().

run_until_complete(awaitable: Awaitable) Any

Spustí dané awaitable, dokud se nedokončí. Pokud awaitable není úloha, bude na úlohu povýšeno.

stop() None

Zastaví smyčku událostí.

close() None

Zavře smyčku událostí.

set_exception_handler(handler: Callable) None

Nastaví obslužnou rutinu výjimek, která se má zavolat, když úloha vyvolá nezachycenou výjimku. handler by měl přijímat dva argumenty: (loop, context).

get_exception_handler() Callable | None

Získá aktuální obslužnou rutinu výjimek. Vrátí obslužnou rutinu, nebo None, pokud není nastavena žádná vlastní obslužná rutina.

default_exception_handler(context: dict) None

Výchozí obslužná rutina výjimek, která je volána.

call_exception_handler(context: dict) None

Zavolá aktuální obslužnou rutinu výjimek. Argument context je předán dál a je to slovník obsahující klíče: 'message', 'exception', 'future'.