Maison >développement back-end >Tutoriel Python >Comment réellement réaliser « Fire and Forget » avec Async/Await de Python ?

Comment réellement réaliser « Fire and Forget » avec Async/Await de Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 01:38:02925parcourir

How to Truly Achieve

"Fire and Forget" avec Async/Await de Python

Dans la syntaxe async/await de Python, exécuter une fonction asynchrone sans attendre qu'elle le fasse Il n'est pas possible d'obtenir l'effet « tirer et oublier » souhaité. Au lieu de cela, le programme se termine avec un avertissement d'exécution.

asyncio.Tâche pour "Fire and Forget"

Pour implémenter "fire and Forget" dans asyncio, utilisez asyncio. Tâche pour créer une tâche qui effectue l'opération souhaitée en arrière-plan. En appelant asyncio.ensure_future(async_foo()), la tâche associée à async_foo() est démarrée et n'attend pas son achèvement. Il s'agit d'une approche simple mais efficace pour les opérations asynchrones qui ne nécessitent pas d'être explicitement attendues.

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

Terminer les tâches en attente

Notez que les tâches créées à l'aide d'asyncio. Les tâches devraient être terminées avant la fin de la boucle d'événements. Si des tâches restent en attente, un avertissement sera généré. Pour éviter cela, attendez explicitement toutes les tâches en attente une fois la boucle d'événements terminée.

async def main():
    asyncio.ensure_future(async_foo())  # Fire and forget async_foo()

    loop = asyncio.get_event_loop()
    await asyncio.gather(*asyncio.Task.all_tasks())

Annuler des tâches au lieu d'attendre

Alternativement, si vous ne souhaitez pas attendre indéfiniment certaines tâches, vous pouvez les annuler :

async def echo_forever():
    while True:
        print("Echo")
        await asyncio.sleep(1)


async def main():
    asyncio.ensure_future(echo_forever())  # Fire and forget echo_forever()

    loop = asyncio.get_event_loop()
    for task in asyncio.Task.all_tasks():
        task.cancel()
        with suppress(asyncio.CancelledError):
            await 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!

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