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
Libérer: 2024-11-09 01:38:02
original
960 Les gens l'ont consulté

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()
Copier après la connexion

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())
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal