Maison  >  Article  >  développement back-end  >  Comment implémenter des opérations asynchrones « Fire and Forget » dans Python Async/Await ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-09 01:08:02218parcourir

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

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

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)

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!

Déclaration:
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