Maison  >  Article  >  développement back-end  >  Comment pouvez-vous implémenter « Fire and Forget » avec Async/Await de Python ?

Comment pouvez-vous implémenter « Fire and Forget » avec Async/Await de Python ?

DDD
DDDoriginal
2024-11-09 04:46:02736parcourir

How Can You Implement

"Fire and Forget" avec Python Async/Await

Introduction

La programmation asynchrone en Python implique souvent des tâches qui ne nécessitent pas une attention immédiate. Une approche pour gérer de telles tâches consiste à utiliser le modèle "Fire and Forget", qui permet à une tâche de s'exécuter simultanément sans bloquer le flux d'exécution principal.

"Fire and Forget" avec Async/Await

Dans l'implémentation de la coroutine de Tornado, ce modèle pourrait être obtenu en omettant le mot-clé rendement. Cependant, à partir de Python 3.5, la syntaxe async/await nécessite une approche différente.

asyncio.Task to "Fire and Forget"

Selon la documentation Python pour asyncio.Task, les coroutines peuvent être exécuté "en arrière-plan" en utilisant asyncio.ensure_future pour créer une tâche. Cette tâche s'exécutera simultanément sans bloquer la fonction.

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

    # ... Other code can be executed here ...

Gestion des tâches en attente

Par défaut, asyncio s'attend à ce que les tâches soient terminées avant la fin de la boucle d'événements. Si les tâches sont toujours en cours d'exécution une fois la boucle d'événements terminée, un avertissement sera émis. Pour éviter cet avertissement, toutes les tâches en attente doivent être attendues une fois la boucle d'événements terminée.

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

# Wait for any remaining tasks
pending = asyncio.Task.all_tasks()
await asyncio.gather(*pending)

Annulation des tâches

Dans certains cas, les tâches peuvent devoir être annulées au lieu d'être attendues. Cela peut être fait en utilisant task.cancel(), mais il faut attendre la tâche annulée pour terminer son annulation.

# ... Same code as before ...

# Cancel all running tasks
pending = asyncio.Task.all_tasks()
for task in pending:
    task.cancel()
    with suppress(asyncio.CancelledError):
        await asyncio.wait_for(task, timeout=None)

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