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.
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.
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!