asyncio — asynchrone I/O-scheduler

Deze module biedt een coöperatieve multitasking-scheduler voor async/await-coroutines, samen met primitieven voor synchronisatie (locks, events) en niet-blokkerend TCP-netwerken via stream readers en writers. Taken worden gelijktijdig uitgevoerd op één enkele event loop; de momenteel uitgevoerde taak geeft de controle met await terug aan de loop.

Voorbeeld:

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

Kernfuncties

asyncio.create_task(coro: Coroutine) Task

Maak een nieuwe taak van de gegeven coroutine en plan deze om uitgevoerd te worden.

Retourneert het bijbehorende Task-object.

asyncio.current_task() Task

Retourneert het Task-object dat is gekoppeld aan de momenteel uitgevoerde taak.

asyncio.run(coro: Coroutine) Any

Maak een nieuwe taak van de gegeven coroutine en voer deze uit totdat ze voltooid is.

Retourneert de waarde die door coro wordt teruggegeven.

asyncio.sleep(t: float) None

Slaap gedurende t seconden (kan een float zijn).

Dit is een coroutine.

asyncio.sleep_ms(t: int) None

Slaap gedurende t milliseconden.

Dit is een coroutine en een MicroPython-uitbreiding.

Aanvullende functies

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

Wacht totdat de awaitable voltooid is, maar annuleer deze als ze langer dan timeout seconden duurt. Als awaitable geen taak is, wordt er een taak van gemaakt.

Als er een timeout optreedt, wordt de taak geannuleerd en wordt asyncio.TimeoutError opgeworpen: dit moet door de aanroeper worden opgevangen. De taak ontvangt asyncio.CancelledError, die genegeerd kan worden of opgevangen kan worden met try...except of try...finally om opruimcode uit te voeren.

Retourneert de retourwaarde van awaitable.

Dit is een coroutine.

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

Vergelijkbaar met wait_for(), maar timeout is een geheel getal in milliseconden.

Dit is een coroutine en een MicroPython-uitbreiding.

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

Voer alle awaitables gelijktijdig uit. Alle awaitables die geen taken zijn, worden tot taken bevorderd.

Retourneert een lijst met de retourwaarden van alle awaitables.

Dit is een coroutine.

class Task

class asyncio.Task

Dit object verpakt een coroutine in een uitgevoerde taak. Op taken kan worden gewacht met await task, wat wacht totdat de taak voltooid is en de retourwaarde van de taak teruggeeft.

Taken mogen niet rechtstreeks worden aangemaakt; gebruik in plaats daarvan create_task() om ze aan te maken.

cancel() None

Annuleer de taak door er asyncio.CancelledError in te injecteren. De taak kan deze uitzondering negeren. Opruimcode kan worden uitgevoerd door deze op te vangen, of via try ... finally.

class Event

class asyncio.Event

Maak een nieuw event aan dat gebruikt kan worden om taken te synchroniseren. Events beginnen in de gewiste toestand.

is_set() bool

Retourneert True als het event is ingesteld, anders False.

set() None

Stel het event in. Alle taken die op het event wachten, worden gepland om uitgevoerd te worden.

Opmerking: dit moet vanuit een taak worden aangeroepen. Het is niet veilig om dit aan te roepen vanuit een IRQ, scheduler-callback of een andere thread. Zie ThreadSafeFlag.

clear() None

Wis het event.

wait() None

Wacht totdat het event is ingesteld. Als het event al is ingesteld, keert het onmiddellijk terug.

Dit is een coroutine.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

Maak een nieuwe vlag aan die gebruikt kan worden om een taak te synchroniseren met code die buiten de asyncio-loop draait, zoals andere threads, IRQ’s of scheduler-callbacks. Vlaggen beginnen in de gewiste toestand.

set() None

Stel de vlag in. Als er een taak op de vlag wacht, wordt deze gepland om uitgevoerd te worden.

clear() None

Wis de vlag. Dit kan gebruikt worden om ervoor te zorgen dat een mogelijk eerder ingestelde vlag gewist is voordat erop gewacht wordt.

wait() None

Wacht totdat de vlag is ingesteld. Als de vlag al is ingesteld, keert het onmiddellijk terug. De vlag wordt automatisch teruggezet bij terugkeer uit wait.

Op een vlag kan slechts één taak tegelijk wachten.

Dit is een coroutine.

class Lock

class asyncio.Lock

Maak een nieuwe lock aan die gebruikt kan worden om taken te coördineren. Locks beginnen in de ontgrendelde toestand.

Naast de onderstaande methoden kunnen locks gebruikt worden in een async with-statement.

locked() bool

Retourneert True als de lock vergrendeld is, anders False.

acquire() bool

Wacht totdat de lock zich in de ontgrendelde toestand bevindt en vergrendel deze vervolgens op een atomaire manier. Slechts één taak kan de lock op enig moment verkrijgen.

Dit is een coroutine.

release() None

Geef de lock vrij. Als er taken op de lock wachten, wordt de volgende in de wachtrij gepland om uitgevoerd te worden en blijft de lock vergrendeld. Anders wachten er geen taken en wordt de lock ontgrendeld.

TCP-streamverbindingen

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

Open een TCP-verbinding naar de gegeven host en port. Het host-adres wordt opgelost met socket.getaddrinfo(), wat momenteel een blokkerende aanroep is. Als ssl een ssl.SSLContext-object is, wordt deze context gebruikt om het transport aan te maken; als ssl True is, wordt een standaardcontext gebruikt.

Retourneert een paar streams: een reader- en een writer-stream. Werpt een socketspecifieke OSError op als de host niet opgelost kon worden of als de verbinding niet tot stand gebracht kon worden.

Dit is een coroutine.

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

Start een TCP-server op de gegeven host en port. De callback wordt aangeroepen bij inkomende, geaccepteerde verbindingen en krijgt 2 argumenten doorgegeven: reader- en writer-streams voor de verbinding.

Als ssl een ssl.SSLContext-object is, wordt deze context gebruikt om het transport aan te maken.

Retourneert een Server-object.

Dit is een coroutine.

class asyncio.Stream

Dit vertegenwoordigt een TCP-streamverbinding. Om code te minimaliseren implementeert deze klasse zowel een reader als een writer, en zowel StreamReader als StreamWriter zijn aliassen voor deze klasse.

get_extra_info(v: str) Any

Verkrijg extra informatie over de stream, gegeven door v. De geldige waarden voor v zijn: peername.

close() None

Sluit de stream.

wait_closed() None

Wacht totdat de stream gesloten is.

Dit is een coroutine.

read(n: int = -1) bytes

Lees maximaal n bytes en retourneer deze. Als n niet wordt opgegeven of -1 is, lees dan alle bytes tot EOF. De geretourneerde waarde is een leeg bytes-object als EOF wordt aangetroffen voordat er bytes zijn gelezen.

Dit is een coroutine.

readinto(buf: bytearray | memoryview) int

Lees maximaal n bytes in buf, waarbij n gelijk is aan de lengte van buf.

Retourneert het aantal bytes dat in buf is gelezen.

Dit is een coroutine en een MicroPython-uitbreiding.

readexactly(n: int) bytes

Lees precies n bytes en retourneer deze als een bytes-object.

Werpt een EOFError-uitzondering op als de stream eindigt voordat n bytes zijn gelezen.

Dit is een coroutine.

readline() bytes

Lees een regel en retourneer deze.

Dit is een coroutine.

write(buf: bytes) None

Voeg buf toe aan de uitvoerbuffer. De data wordt pas weggeschreven wanneer Stream.drain() wordt aangeroepen. Het wordt aanbevolen om Stream.drain() onmiddellijk na het aanroepen van deze functie aan te roepen.

drain() None

Schrijf (drain) alle gebufferde uitvoerdata weg naar de stream.

Dit is een coroutine.

class asyncio.Server

Dit vertegenwoordigt de serverklasse die door start_server() wordt geretourneerd. Deze kan gebruikt worden in een async with-statement om de server bij het verlaten te sluiten.

close() None

Sluit de server.

wait_closed() None

Wacht totdat de server gesloten is.

Dit is een coroutine.

Event Loop

asyncio.get_event_loop() Loop

Retourneert de event loop die gebruikt wordt om taken te plannen en uit te voeren. Zie Loop.

asyncio.new_event_loop() Loop

Zet de event loop terug en retourneer deze.

Opmerking: aangezien MicroPython slechts één enkele event loop heeft, zet deze functie alleen de toestand van de loop terug; er wordt geen nieuwe aangemaakt.

class asyncio.Loop

Dit vertegenwoordigt het object dat taken plant en uitvoert. Het kan niet aangemaakt worden; gebruik in plaats daarvan get_event_loop().

create_task(coro: Coroutine) Task

Maak een taak van de gegeven coro en retourneer het nieuwe Task-object.

run_forever() None

Voer de event loop uit totdat stop() wordt aangeroepen.

run_until_complete(awaitable: Awaitable) Any

Voer de gegeven awaitable uit totdat deze voltooid is. Als awaitable geen taak is, wordt deze tot een taak bevorderd.

stop() None

Stop de event loop.

close() None

Sluit de event loop.

set_exception_handler(handler: Callable) None

Stel de exception handler in die aangeroepen moet worden wanneer een taak een uitzondering opwerpt die niet wordt opgevangen. De handler moet twee argumenten accepteren: (loop, context).

get_exception_handler() Callable | None

Verkrijg de huidige exception handler. Retourneert de handler, of None als er geen aangepaste handler is ingesteld.

default_exception_handler(context: dict) None

De standaard exception handler die wordt aangeroepen.

call_exception_handler(context: dict) None

Roep de huidige exception handler aan. Het argument context wordt doorgegeven en is een dictionary met de sleutels: 'message', 'exception', 'future'.