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