"Fire and Forget" Python Async/Await
En programmation asynchrone, il peut être utile d'effectuer des opérations non critiques sans attendre leur achèvement. Dans Tornado, ce comportement « tirer et oublier » peut être obtenu en omettant le mot-clé rendement dans une coroutine. Cependant, dans la syntaxe async/await de Python 3.5, cette approche entraîne un avertissement d'exécution et la non-exécution de l'opération souhaitée.
Solution : asyncio.Task
Selon la documentation Python pour asyncio.Task, il permet l'exécution d'une coroutine "en arrière-plan". En utilisant asyncio.ensure_future pour générer une tâche, l'exécution n'est pas bloquée et la fonction revient immédiatement, similaire au comportement « lancer et oublier ».
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() # Perform other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
Sortie :
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
Gestion des tâches en attente
Si les tâches sont toujours en cours d'exécution une fois la boucle d'événements terminée, un avertissement peut s'afficher. Pour éviter cela, toutes les tâches en attente peuvent être attendues une fois la boucle d'événements terminée :
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
Annulation des tâches
Dans certains cas, il peut être nécessaire d'annuler les tâches qui ne devraient pas être achevés. Ceci peut être réalisé en utilisant task.cancel() :
# Let's also cancel all running tasks: pending = asyncio.Task.all_tasks() for task in pending: task.cancel() # Now we should await task to execute it's cancellation. # Cancelled task raises asyncio.CancelledError that we can suppress: with suppress(asyncio.CancelledError): loop.run_until_complete(task)
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!