Comment implémenter des opérations asynchrones « Fire and Forget » dans Python Async/Await ?

Barbara Streisand
Libérer: 2024-11-09 01:08:02
original
226 Les gens l'ont consulté

How to Implement

"Fire and Forget" en Python Async/Await

Dans certains scénarios, il est nécessaire de lancer une opération asynchrone qui ne nécessite pas d'attendre son achèvement . Traditionnellement, l'approche « tirer et oublier » dans les coroutines de Tornado pouvait être obtenue en omettant le mot-clé rendement.

Dans la syntaxe async/await de Python 3.5, cependant, une telle implémentation déclenche un RuntimeWarning, indiquant que la coroutine n'a jamais été attendu.

Asyncio.Task : La solution

Heureusement, la bibliothèque asyncio de Python fournit une solution via sa classe asyncio.Task. Cela permet la création d'une tâche qui peut s'exécuter en arrière-plan, sans bloquer l'exécution principale.

import asyncio

async def async_foo():
    print("async_foo started")
    await asyncio.sleep(1)
    print("async_foo done")

async def main():
    asyncio.ensure_future(async_foo())  # fire and forget async_foo()

    # continue with other actions

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
Copier après la connexion

Cette approche garantit que async_foo() est exécuté de manière asynchrone tandis que les autres actions peuvent continuer sans attendre.

Gestion des tâches en attente

Il est important de noter que lorsque la boucle d'événements est terminée, asyncio s'attend à ce que toutes les tâches soient terminées. Ainsi, toutes les tâches en attente restantes peuvent entraîner des avertissements. Pour éviter cela, on peut soit attendre toutes les tâches en attente, soit les annuler.

Option 1 : Attendre les tâches en attente

pending = asyncio.Task.all_tasks()
loop.run_until_complete(asyncio.gather(*pending))
Copier après la connexion

Option 2 : Annuler les tâches en attente Tâches

pending = asyncio.Task.all_tasks()
for task in pending:
    task.cancel()
    with suppress(asyncio.CancelledError):
        loop.run_until_complete(task)
Copier après la connexion

En annulant les tâches, elles sont supprimées du planning de la boucle d'événements, évitant ainsi tout avertissement potentiel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!