asyncio — ordonnanceur d’entrées/sorties asynchrones#

Ce module fournit un ordonnanceur multitâche coopératif pour les coroutines async/await, ainsi que des primitives de synchronisation (verrous, événements) et la mise en réseau TCP non bloquante via des lecteurs et écrivains de flux. Les tâches s’exécutent simultanément sur une unique boucle d’événements ; la tâche en cours d’exécution rend le contrôle à la boucle avec await.

Exemple

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

Fonctions principales#

asyncio.create_task(coro: Coroutine) Task#

Crée une nouvelle tâche à partir de la coroutine donnée et la planifie pour exécution.

Renvoie l’objet Task correspondant.

asyncio.current_task() Task#

Renvoie l’objet Task associé à la tâche en cours d’exécution.

asyncio.run(coro: Coroutine) Any#

Crée une nouvelle tâche à partir de la coroutine donnée et l’exécute jusqu’à son achèvement.

Renvoie la valeur renvoyée par coro.

asyncio.sleep(t: float) None#

Met en pause pendant t secondes (peut être un flottant).

Ceci est une coroutine.

asyncio.sleep_ms(t: int) None#

Met en pause pendant t millisecondes.

Ceci est une coroutine, ainsi qu’une extension MicroPython.

Fonctions supplémentaires#

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

Attend que l”awaitable se termine, mais l’annule s’il prend plus de timeout secondes. Si l”awaitable n’est pas une tâche, une tâche en sera créée.

En cas de dépassement de délai, la tâche est annulée et une asyncio.TimeoutError est levée : celle-ci doit être interceptée par l’appelant. La tâche reçoit asyncio.CancelledError qui peut être ignorée ou interceptée à l’aide de try...except ou try...finally pour exécuter du code de nettoyage.

Renvoie la valeur de retour de l”awaitable.

Ceci est une coroutine.

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

Similaire à wait_for() mais timeout est un entier en millisecondes.

Ceci est une coroutine, ainsi qu’une extension MicroPython.

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

Exécute simultanément tous les awaitables. Tout awaitable qui n’est pas une tâche est promu en tâche.

Renvoie une liste des valeurs de retour de tous les awaitables.

Ceci est une coroutine.

class Task#

class asyncio.Task#

Cet objet encapsule une coroutine dans une tâche en cours d’exécution. Il est possible d’attendre les tâches avec await task, ce qui attendra l’achèvement de la tâche et renverra sa valeur de retour.

Les tâches ne doivent pas être créées directement ; utilisez plutôt create_task() pour les créer.

cancel() None#

Annule la tâche en y injectant asyncio.CancelledError. La tâche peut ignorer cette exception. Du code de nettoyage peut être exécuté en l’interceptant, ou via try ... finally.

class Event#

class asyncio.Event#

Crée un nouvel événement pouvant servir à synchroniser des tâches. Les événements démarrent à l’état effacé.

is_set() bool#

Renvoie True si l’événement est positionné, False sinon.

set() None#

Positionne l’événement. Toutes les tâches en attente de l’événement seront planifiées pour exécution.

Remarque : ceci doit être appelé depuis une tâche. Il n’est pas sûr de l’appeler depuis une IRQ, une fonction de rappel de l’ordonnanceur ou un autre fil d’exécution. Voir ThreadSafeFlag.

clear() None#

Efface l’événement.

wait() None#

Attend que l’événement soit positionné. Si l’événement est déjà positionné, renvoie immédiatement.

Ceci est une coroutine.

class ThreadSafeFlag#

class asyncio.ThreadSafeFlag#

Crée un nouveau drapeau pouvant servir à synchroniser une tâche avec du code s’exécutant en dehors de la boucle asyncio, tel que d’autres fils d’exécution, des IRQ ou des fonctions de rappel de l’ordonnanceur. Les drapeaux démarrent à l’état effacé.

set() None#

Positionne le drapeau. Si une tâche est en attente du drapeau, elle sera planifiée pour exécution.

clear() None#

Efface le drapeau. Ceci peut servir à s’assurer qu’un drapeau éventuellement positionné auparavant est effacé avant de l’attendre.

wait() None#

Attend que le drapeau soit positionné. Si le drapeau est déjà positionné, renvoie immédiatement. Le drapeau est automatiquement réinitialisé au retour de wait.

Un drapeau ne peut être attendu que par une seule tâche à la fois.

Ceci est une coroutine.

class Lock#

class asyncio.Lock#

Crée un nouveau verrou pouvant servir à coordonner des tâches. Les verrous démarrent à l’état déverrouillé.

En plus des méthodes ci-dessous, les verrous peuvent être utilisés dans une instruction async with.

locked() bool#

Renvoie True si le verrou est verrouillé, False sinon.

acquire() bool#

Attend que le verrou soit à l’état déverrouillé puis le verrouille de manière atomique. Une seule tâche peut acquérir le verrou à un instant donné.

Ceci est une coroutine.

release() None#

Libère le verrou. Si des tâches sont en attente du verrou, la suivante dans la file est planifiée pour exécution et le verrou reste verrouillé. Sinon, aucune tâche n’est en attente et le verrou devient déverrouillé.

Connexions de flux TCP#

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

Ouvre une connexion TCP vers le host et le port donnés. L’adresse host sera résolue à l’aide de socket.getaddrinfo(), qui est actuellement un appel bloquant. Si ssl est un objet ssl.SSLContext, ce contexte est utilisé pour créer le transport ; si ssl vaut True, un contexte par défaut est utilisé.

Renvoie une paire de flux : un flux lecteur et un flux écrivain. Lève une OSError spécifique à la socket si l’hôte n’a pas pu être résolu ou si la connexion n’a pas pu être établie.

Ceci est une coroutine.

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

Démarre un serveur TCP sur le host et le port donnés. Le callback sera appelé pour les connexions entrantes acceptées, et recevra 2 arguments : les flux lecteur et écrivain de la connexion.

Si ssl est un objet ssl.SSLContext, ce contexte est utilisé pour créer le transport.

Renvoie un objet Server.

Ceci est une coroutine.

class asyncio.Stream#

Ceci représente une connexion de flux TCP. Pour minimiser le code, cette classe implémente à la fois un lecteur et un écrivain, et StreamReader et StreamWriter sont tous deux des alias de cette classe.

get_extra_info(v: str) Any#

Obtient des informations supplémentaires sur le flux, indiquées par v. Les valeurs valides pour v sont : peername.

close() None#

Ferme le flux.

wait_closed() None#

Attend la fermeture du flux.

Ceci est une coroutine.

read(n: int = -1) bytes#

Lit jusqu’à n octets et les renvoie. Si n n’est pas fourni ou vaut -1, lit tous les octets jusqu’à EOF. La valeur renvoyée sera un objet bytes vide si EOF est rencontré avant qu’aucun octet n’ait été lu.

Ceci est une coroutine.

readinto(buf: bytearray | memoryview) int#

Lit jusqu’à n octets dans buf, n étant égal à la longueur de buf.

Renvoie le nombre d’octets lus dans buf.

Ceci est une coroutine, ainsi qu’une extension MicroPython.

readexactly(n: int) bytes#

Lit exactement n octets et les renvoie sous forme d’objet bytes.

Lève une exception EOFError si le flux se termine avant la lecture de n octets.

Ceci est une coroutine.

readline() bytes#

Lit une ligne et la renvoie.

Ceci est une coroutine.

write(buf: bytes) None#

Accumule buf dans le tampon de sortie. Les données ne sont vidées que lorsque Stream.drain() est appelée. Il est recommandé d’appeler Stream.drain() immédiatement après l’appel de cette fonction.

drain() None#

Vide (écrit) toutes les données de sortie mises en tampon vers le flux.

Ceci est une coroutine.

class asyncio.Server#

Ceci représente la classe de serveur renvoyée par start_server(). Elle peut être utilisée dans une instruction async with pour fermer le serveur à la sortie.

close() None#

Ferme le serveur.

wait_closed() None#

Attend la fermeture du serveur.

Ceci est une coroutine.

Boucle d’événements#

asyncio.get_event_loop() Loop#

Renvoie la boucle d’événements utilisée pour planifier et exécuter les tâches. Voir Loop.

asyncio.new_event_loop() Loop#

Réinitialise la boucle d’événements et la renvoie.

Remarque : étant donné que MicroPython ne possède qu’une seule boucle d’événements, cette fonction réinitialise uniquement l’état de la boucle, elle n’en crée pas de nouvelle.

class asyncio.Loop#

Ceci représente l’objet qui planifie et exécute les tâches. Il ne peut pas être créé ; utilisez get_event_loop() à la place.

create_task(coro: Coroutine) Task#

Crée une tâche à partir du coro donné et renvoie le nouvel objet Task.

run_forever() None#

Exécute la boucle d’événements jusqu’à ce que stop() soit appelée.

run_until_complete(awaitable: Awaitable) Any#

Exécute l”awaitable donné jusqu’à son achèvement. Si l”awaitable n’est pas une tâche, il sera promu en tâche.

stop() None#

Arrête la boucle d’événements.

close() None#

Ferme la boucle d’événements.

set_exception_handler(handler: Callable) None#

Définit le gestionnaire d’exceptions à appeler lorsqu’une tâche lève une exception qui n’est pas interceptée. Le handler doit accepter deux arguments : (loop, context).

get_exception_handler() Callable | None#

Obtient le gestionnaire d’exceptions actuel. Renvoie le gestionnaire, ou None si aucun gestionnaire personnalisé n’est défini.

default_exception_handler(context: dict) None#

Le gestionnaire d’exceptions par défaut qui est appelé.

call_exception_handler(context: dict) None#

Appelle le gestionnaire d’exceptions actuel. L’argument context est transmis tel quel et est un dictionnaire contenant les clés : 'message', 'exception', 'future'.