Maison > développement back-end > Tutoriel Python > Comment obtenir le comportement « Fire and Forget » dans Async/Await de Python 3.5 ?

Comment obtenir le comportement « Fire and Forget » dans Async/Await de Python 3.5 ?

DDD
Libérer: 2024-11-08 21:52:01
original
523 Les gens l'ont consulté

How to Achieve

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

Sortie :

async_foo started
Do some actions 1
async_foo done
Do some actions 2
Do some actions 3
Copier après la connexion

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

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)
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal