asyncio — scheduler di I/O asincrono¶
Questo modulo fornisce uno scheduler a multitasking cooperativo per le coroutine async/await, insieme a primitive per la sincronizzazione (lock, eventi) e per il networking TCP non bloccante tramite reader e writer di stream. I task vengono eseguiti in modo concorrente su un singolo event loop; il task attualmente in esecuzione restituisce il controllo al loop con await.
Esempio:
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)))
Funzioni principali¶
- asyncio.create_task(coro: Coroutine) Task¶
Crea un nuovo task a partire dalla coroutine specificata e lo pianifica per l’esecuzione.
Restituisce il corrispondente oggetto
Task.
- asyncio.current_task() Task¶
Restituisce l’oggetto
Taskassociato al task attualmente in esecuzione.
- asyncio.run(coro: Coroutine) Any¶
Crea un nuovo task a partire dalla coroutine specificata e lo esegue fino al completamento.
Restituisce il valore restituito da coro.
Funzioni aggiuntive¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
Attende il completamento di awaitable, ma lo annulla se richiede più di timeout secondi. Se awaitable non è un task, ne verrà creato uno a partire da esso.
Se si verifica un timeout, il task viene annullato e viene sollevata l’eccezione
asyncio.TimeoutError: questa dovrebbe essere intercettata dal chiamante. Il task riceveasyncio.CancelledError, che può essere ignorata oppure intercettata usandotry...exceptotry...finallyper eseguire codice di pulizia.Restituisce il valore restituito da awaitable.
Questa è una coroutine.
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
Simile a
wait_for(), ma timeout è un intero in millisecondi.Questa è una coroutine, oltre che un’estensione di MicroPython.
class Task¶
- class asyncio.Task¶
Questo oggetto incapsula una coroutine in un task in esecuzione. È possibile attendere i task usando
await task, che attenderà il completamento del task e restituirà il valore restituito dal task stesso.I task non dovrebbero essere creati direttamente; è preferibile usare
create_task()per crearli.
class Event¶
- class asyncio.Event¶
Crea un nuovo evento che può essere usato per sincronizzare i task. Gli eventi partono nello stato azzerato.
- set() None¶
Imposta l’evento. Tutti i task in attesa dell’evento verranno pianificati per l’esecuzione.
Nota: questo metodo deve essere chiamato dall’interno di un task. Non è sicuro chiamarlo da un IRQ, da una callback dello scheduler o da un altro thread. Vedi
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Crea un nuovo flag che può essere usato per sincronizzare un task con codice in esecuzione al di fuori del loop asyncio, come altri thread, IRQ o callback dello scheduler. I flag partono nello stato azzerato.
- set() None¶
Imposta il flag. Se c’è un task in attesa del flag, questo verrà pianificato per l’esecuzione.
class Lock¶
- class asyncio.Lock¶
Crea un nuovo lock che può essere usato per coordinare i task. I lock partono nello stato sbloccato.
Oltre ai metodi descritti di seguito, i lock possono essere usati in un’istruzione
async with.
Connessioni stream TCP¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
Apre una connessione TCP verso l”host e la port specificati. L’indirizzo host verrà risolto usando
socket.getaddrinfo(), che attualmente è una chiamata bloccante. Se ssl è un oggettossl.SSLContext, questo contesto viene usato per creare il trasporto; se ssl èTrue, viene usato un contesto predefinito.Restituisce una coppia di stream: uno stream reader e uno stream writer. Solleverà un
OSErrorspecifico del socket se non è stato possibile risolvere l’host o se non è stato possibile stabilire la connessione.Questa è una coroutine.
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
Avvia un server TCP sull”host e la port specificati. La callback verrà chiamata con le connessioni in ingresso accettate, e riceverà 2 argomenti: gli stream reader e writer della connessione.
Se ssl è un oggetto
ssl.SSLContext, questo contesto viene usato per creare il trasporto.Restituisce un oggetto
Server.Questa è una coroutine.
- class asyncio.Stream¶
Questo rappresenta una connessione stream TCP. Per ridurre al minimo il codice, questa classe implementa sia un reader che un writer, e sia
StreamReadercheStreamWritersono alias di questa classe.- get_extra_info(v: str) Any¶
Ottiene informazioni aggiuntive sullo stream, indicate da v. I valori validi per v sono:
peername.
- read(n: int = -1) bytes¶
Legge fino a n byte e li restituisce. Se n non viene fornito oppure è -1, legge tutti i byte fino a EOF. Il valore restituito sarà un oggetto bytes vuoto se viene incontrato EOF prima della lettura di qualsiasi byte.
Questa è una coroutine.
- readinto(buf: bytearray | memoryview) int¶
Legge fino a n byte in buf, con n pari alla lunghezza di buf.
Restituisce il numero di byte letti in buf.
Questa è una coroutine, oltre che un’estensione di MicroPython.
- readexactly(n: int) bytes¶
Legge esattamente n byte e li restituisce come oggetto bytes.
Solleva un’eccezione
EOFErrorse lo stream termina prima di leggere n byte.Questa è una coroutine.
- write(buf: bytes) None¶
Accumula buf nel buffer di output. I dati vengono scaricati solo quando viene chiamato
Stream.drain(). Si consiglia di chiamareStream.drain()immediatamente dopo aver chiamato questa funzione.
Event Loop¶
- asyncio.get_event_loop() Loop¶
Restituisce l’event loop usato per pianificare ed eseguire i task. Vedi
Loop.
- asyncio.new_event_loop() Loop¶
Resetta l’event loop e lo restituisce.
Nota: poiché MicroPython ha un solo event loop, questa funzione si limita a resettare lo stato del loop, non ne crea uno nuovo.
- class asyncio.Loop¶
Questo rappresenta l’oggetto che pianifica ed esegue i task. Non può essere creato; usa invece
get_event_loop().- create_task(coro: Coroutine) Task¶
Crea un task a partire dalla coro specificata e restituisce il nuovo oggetto
Task.
- run_until_complete(awaitable: Awaitable) Any¶
Esegue l”awaitable specificato fino al suo completamento. Se awaitable non è un task, verrà promosso a task.
- set_exception_handler(handler: Callable) None¶
Imposta il gestore delle eccezioni da chiamare quando un Task solleva un’eccezione non intercettata. Il handler deve accettare due argomenti:
(loop, context).
- get_exception_handler() Callable | None¶
Ottiene il gestore delle eccezioni corrente. Restituisce il gestore, oppure
Nonese non è impostato alcun gestore personalizzato.