web-dev-qa-db-fra.com

Appelez Async fonction de la fonction de synchronisation, tandis que la fonction synchrone continue: Python

Après avoir parcouru de nombreux documents sur AsyncIO et articles, je ne pouvais toujours pas trouver de réponse à ceci: ((( exécutez une fonction asynchrone (sans utiliser de fil) et assurez-vous également la Fonction appelant cette fonction asynchrone continue son exécution.

pseudo - code :

async def functionAsync(p):
    #...
    #perform intensive calculations
    #...
    print ("Async loop done")

def functionNormal():
    p = ""
    functionA(p)
    return ("Main loop ended")

 print ("Start Code")
 print functionNormal()

Production attendue :

Start code
Main loop ended
Async loop done

Exemples recherchés où loop.run_until_complete Est utilisé, mais cela ne retournera pas la valeur d'impression de functionNormal() car elle bloque la nature.

6
Shivansh Jagga

asyncio ne peut pas exécuter de code arbitraire "en arrière-plan" sans utiliser de threads. Comme user4815162342 est noté est asyncio Vous exécutez une boucle d'événement qui bloque le fil principal et gère l'exécution des coroutines.

Si vous souhaitez utiliser asyncio et profitez de l'utilisation de l'utilisation, vous devez réécrire toutes vos fonctions qui utilisent des coroutines pour être des Coroutines, soit jusqu'à la fonction principale - point d'entrée de votre programme. Cette coroutine principale est généralement transmise à run_until_complete. Ceci Little Post révèle ce sujet plus en détail.


Depuis que vous êtes intéressé par le flacon, regardez un look Quart : C'est un cadre Web qui tente de mettre en œuvre Flask API (autant que possible) en termes de asyncio . Raison Ce projet existe est parce que pur Flask n'est pas compatible avec asyncio. Quart est écrit pour être compatible.

Si vous voulez rester avec du flacon pur, mais avez des trucs asynchrones, jetez un coup d'œil à Gevent . Grâce à la correction de singe, cela peut rendre votre code asynchrone. Bien que cette solution ait ses propres problèmes (pourquoi asyncio a été créé).

2
Mikhail Gerasimov