asyncio — asynchroner I/O-Scheduler#

Dieses Modul stellt einen kooperativen Multitasking-Scheduler für async/await-Coroutinen bereit, zusammen mit Primitiven zur Synchronisation (Locks, Events) und nicht blockierendem TCP-Netzwerkbetrieb über Stream-Reader und -Writer. Tasks werden nebenläufig auf einer einzigen Event-Loop ausgeführt; der aktuell laufende Task gibt die Kontrolle mit await an die Loop zurück.

Beispiel:

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

Kernfunktionen#

asyncio.create_task(coro: Coroutine) Task#

Erstellt einen neuen Task aus der angegebenen Coroutine und plant ihn zur Ausführung ein.

Gibt das zugehörige Task-Objekt zurück.

asyncio.current_task() Task#

Gibt das Task-Objekt zurück, das mit dem aktuell laufenden Task verknüpft ist.

asyncio.run(coro: Coroutine) Any#

Erstellt einen neuen Task aus der angegebenen Coroutine und führt ihn bis zum Abschluss aus.

Gibt den von coro zurückgegebenen Wert zurück.

asyncio.sleep(t: float) None#

Schläft für t Sekunden (kann ein Float sein).

Dies ist eine Coroutine.

asyncio.sleep_ms(t: int) None#

Schläft für t Millisekunden.

Dies ist eine Coroutine und eine MicroPython-Erweiterung.

Zusätzliche Funktionen#

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

Wartet auf den Abschluss des awaitable, bricht es jedoch ab, wenn es länger als timeout Sekunden dauert. Wenn awaitable kein Task ist, wird daraus ein Task erstellt.

Tritt ein Timeout auf, wird der Task abgebrochen und asyncio.TimeoutError ausgelöst: Dies sollte vom Aufrufer abgefangen werden. Der Task erhält asyncio.CancelledError, was ignoriert oder mit try...except bzw. try...finally abgefangen werden kann, um Aufräumcode auszuführen.

Gibt den Rückgabewert von awaitable zurück.

Dies ist eine Coroutine.

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

Ähnlich wie wait_for(), aber timeout ist eine Ganzzahl in Millisekunden.

Dies ist eine Coroutine und eine MicroPython-Erweiterung.

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

Führt alle awaitables nebenläufig aus. Alle awaitables, die keine Tasks sind, werden zu Tasks befördert.

Gibt eine Liste der Rückgabewerte aller awaitables zurück.

Dies ist eine Coroutine.

class Task#

class asyncio.Task#

Dieses Objekt kapselt eine Coroutine in einen laufenden Task. Auf Tasks kann mit await task gewartet werden, wodurch auf den Abschluss des Tasks gewartet und dessen Rückgabewert zurückgegeben wird.

Tasks sollten nicht direkt erstellt werden, verwenden Sie stattdessen create_task(), um sie zu erstellen.

cancel() None#

Bricht den Task ab, indem asyncio.CancelledError in ihn injiziert wird. Der Task kann diese Ausnahme ignorieren. Aufräumcode kann durch Abfangen oder über try ... finally ausgeführt werden.

class Event#

class asyncio.Event#

Erstellt ein neues Event, das zur Synchronisation von Tasks verwendet werden kann. Events beginnen im zurückgesetzten Zustand.

is_set() bool#

Gibt True zurück, wenn das Event gesetzt ist, andernfalls False.

set() None#

Setzt das Event. Alle auf das Event wartenden Tasks werden zur Ausführung eingeplant.

Hinweis: Dies muss aus einem Task heraus aufgerufen werden. Es ist nicht sicher, dies aus einem IRQ, einem Scheduler-Callback oder einem anderen Thread aufzurufen. Siehe ThreadSafeFlag.

clear() None#

Löscht das Event.

wait() None#

Wartet, bis das Event gesetzt wird. Ist das Event bereits gesetzt, kehrt es sofort zurück.

Dies ist eine Coroutine.

class ThreadSafeFlag#

class asyncio.ThreadSafeFlag#

Erstellt ein neues Flag, das zur Synchronisation eines Tasks mit Code verwendet werden kann, der außerhalb der asyncio-Loop läuft, etwa andere Threads, IRQs oder Scheduler-Callbacks. Flags beginnen im zurückgesetzten Zustand.

set() None#

Setzt das Flag. Wenn ein Task auf das Flag wartet, wird er zur Ausführung eingeplant.

clear() None#

Löscht das Flag. Dies kann verwendet werden, um sicherzustellen, dass ein möglicherweise zuvor gesetztes Flag gelöscht ist, bevor darauf gewartet wird.

wait() None#

Wartet, bis das Flag gesetzt wird. Ist das Flag bereits gesetzt, kehrt es sofort zurück. Das Flag wird beim Rückkehren aus wait automatisch zurückgesetzt.

Auf ein Flag kann jeweils nur ein einziger Task gleichzeitig warten.

Dies ist eine Coroutine.

class Lock#

class asyncio.Lock#

Erstellt ein neues Lock, das zur Koordination von Tasks verwendet werden kann. Locks beginnen im entsperrten Zustand.

Zusätzlich zu den unten aufgeführten Methoden können Locks in einer async with-Anweisung verwendet werden.

locked() bool#

Gibt True zurück, wenn das Lock gesperrt ist, andernfalls False.

acquire() bool#

Wartet, bis sich das Lock im entsperrten Zustand befindet, und sperrt es dann auf atomare Weise. Nur ein Task kann das Lock zu einem bestimmten Zeitpunkt erwerben.

Dies ist eine Coroutine.

release() None#

Gibt das Lock frei. Wenn Tasks auf das Lock warten, wird der nächste in der Warteschlange zur Ausführung eingeplant und das Lock bleibt gesperrt. Andernfalls warten keine Tasks und das Lock wird entsperrt.

TCP-Stream-Verbindungen#

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

Öffnet eine TCP-Verbindung zum angegebenen host und port. Die host-Adresse wird mit socket.getaddrinfo() aufgelöst, was derzeit ein blockierender Aufruf ist. Wenn ssl ein ssl.SSLContext-Objekt ist, wird dieser Kontext zum Erstellen des Transports verwendet; wenn ssl True ist, wird ein Standardkontext verwendet.

Gibt ein Paar von Streams zurück: einen Reader- und einen Writer-Stream. Löst einen socket-spezifischen OSError aus, wenn der Host nicht aufgelöst werden konnte oder die Verbindung nicht hergestellt werden konnte.

Dies ist eine Coroutine.

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

Startet einen TCP-Server am angegebenen host und port. Der callback wird mit eingehenden, akzeptierten Verbindungen aufgerufen und erhält 2 Argumente übergeben: Reader- und Writer-Streams für die Verbindung.

Wenn ssl ein ssl.SSLContext-Objekt ist, wird dieser Kontext zum Erstellen des Transports verwendet.

Gibt ein Server-Objekt zurück.

Dies ist eine Coroutine.

class asyncio.Stream#

Dies repräsentiert eine TCP-Stream-Verbindung. Um Code zu minimieren, implementiert diese Klasse sowohl einen Reader als auch einen Writer, und sowohl StreamReader als auch StreamWriter sind Aliasnamen für diese Klasse.

get_extra_info(v: str) Any#

Ruft zusätzliche Informationen über den Stream ab, angegeben durch v. Die gültigen Werte für v sind: peername.

close() None#

Schließt den Stream.

wait_closed() None#

Wartet, bis der Stream geschlossen wird.

Dies ist eine Coroutine.

read(n: int = -1) bytes#

Liest bis zu n Bytes und gibt sie zurück. Wird n nicht angegeben oder ist -1, werden alle Bytes bis EOF gelesen. Der zurückgegebene Wert ist ein leeres Bytes-Objekt, wenn EOF erreicht wird, bevor irgendwelche Bytes gelesen wurden.

Dies ist eine Coroutine.

readinto(buf: bytearray | memoryview) int#

Liest bis zu n Bytes in buf, wobei n gleich der Länge von buf ist.

Gibt die Anzahl der in buf gelesenen Bytes zurück.

Dies ist eine Coroutine und eine MicroPython-Erweiterung.

readexactly(n: int) bytes#

Liest genau n Bytes und gibt sie als Bytes-Objekt zurück.

Löst eine EOFError-Ausnahme aus, wenn der Stream endet, bevor n Bytes gelesen wurden.

Dies ist eine Coroutine.

readline() bytes#

Liest eine Zeile und gibt sie zurück.

Dies ist eine Coroutine.

write(buf: bytes) None#

Hängt buf an den Ausgabepuffer an. Die Daten werden erst geleert, wenn Stream.drain() aufgerufen wird. Es wird empfohlen, Stream.drain() unmittelbar nach dem Aufruf dieser Funktion aufzurufen.

drain() None#

Leert (schreibt) alle gepufferten Ausgabedaten in den Stream.

Dies ist eine Coroutine.

class asyncio.Server#

Dies repräsentiert die von start_server() zurückgegebene Server-Klasse. Sie kann in einer async with-Anweisung verwendet werden, um den Server beim Verlassen zu schließen.

close() None#

Schließt den Server.

wait_closed() None#

Wartet, bis der Server geschlossen wird.

Dies ist eine Coroutine.

Event-Loop#

asyncio.get_event_loop() Loop#

Gibt die Event-Loop zurück, die zum Einplanen und Ausführen von Tasks verwendet wird. Siehe Loop.

asyncio.new_event_loop() Loop#

Setzt die Event-Loop zurück und gibt sie zurück.

Hinweis: Da MicroPython nur eine einzige Event-Loop hat, setzt diese Funktion lediglich den Zustand der Loop zurück, sie erstellt keine neue.

class asyncio.Loop#

Dies repräsentiert das Objekt, das Tasks einplant und ausführt. Es kann nicht erstellt werden, verwenden Sie stattdessen get_event_loop().

create_task(coro: Coroutine) Task#

Erstellt einen Task aus der angegebenen coro und gibt das neue Task-Objekt zurück.

run_forever() None#

Führt die Event-Loop aus, bis stop() aufgerufen wird.

run_until_complete(awaitable: Awaitable) Any#

Führt das angegebene awaitable bis zum Abschluss aus. Wenn awaitable kein Task ist, wird es zu einem befördert.

stop() None#

Stoppt die Event-Loop.

close() None#

Schließt die Event-Loop.

set_exception_handler(handler: Callable) None#

Legt den Exception-Handler fest, der aufgerufen wird, wenn ein Task eine Ausnahme auslöst, die nicht abgefangen wird. Der handler sollte zwei Argumente akzeptieren: (loop, context).

get_exception_handler() Callable | None#

Ruft den aktuellen Exception-Handler ab. Gibt den Handler zurück oder None, wenn kein benutzerdefinierter Handler festgelegt ist.

default_exception_handler(context: dict) None#

Der aufgerufene Standard-Exception-Handler.

call_exception_handler(context: dict) None#

Ruft den aktuellen Exception-Handler auf. Das Argument context wird durchgereicht und ist ein Dictionary, das die Schlüssel 'message', 'exception' und 'future' enthält.