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.
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.TimeoutErrorausgelöst: Dies sollte vom Aufrufer abgefangen werden. Der Task erhältasyncio.CancelledError, was ignoriert oder mittry...exceptbzw.try...finallyabgefangen 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.
class Task¶
- class asyncio.Task¶
Dieses Objekt kapselt eine Coroutine in einen laufenden Task. Auf Tasks kann mit
await taskgewartet 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.
class Event¶
- class asyncio.Event¶
Erstellt ein neues Event, das zur Synchronisation von Tasks verwendet werden kann. Events beginnen im zurückgesetzten Zustand.
- 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.
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.
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.
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 einssl.SSLContext-Objekt ist, wird dieser Kontext zum Erstellen des Transports verwendet; wenn sslTrueist, wird ein Standardkontext verwendet.Gibt ein Paar von Streams zurück: einen Reader- und einen Writer-Stream. Löst einen socket-spezifischen
OSErroraus, 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
StreamReaderals auchStreamWritersind 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.
- 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.
- 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.
- class asyncio.Server¶
Dies repräsentiert die von
start_server()zurückgegebene Server-Klasse. Sie kann in einerasync with-Anweisung verwendet werden, um den Server beim Verlassen zu schließen.
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_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.
- 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).