Maison > Article > développement back-end > Comment pouvez-vous implémenter « Fire and Forget » avec Async/Await de Python ?
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.
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.
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 ...
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)
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!