2017-04-20 1 views
1

Mon code:appels asynchrones multiples blocage

import asyncio 

async def test(i): 
    await asyncio.sleep(i) 
    print('test') 

async def main(): 
    await test(2) 
    await test(2) 
    await test(2) 

asyncio.get_event_loop().run_forever(main()) 

Je me attendais pour qu'il dormir pendant trois secondes, puis imprimer 'test' trois fois, mais au lieu qu'il attend 2 secondes avant chaque 'test' séparément (pour la dernière 'test' obtient imprimé à 6 secondes). Qu'est-ce que j'ai mal compris, et comment puis-je résoudre ce problème pour fonctionner comme je m'y attendais? Suspend l'exécution de la fonction en cours jusqu'à ce que le futur soit retourné.

Répondre

1

await Dans test, cela fait attendre la fonction pendant 2 secondes jusqu'à ce que asyncio.sleep soit retourné, avant l'impression. Dans main, il attend que la fonction retourne test (après print après sleep), avant de passer à la ligne suivante avec le await test suivant.

Si vous voulez exécuter toutes test en même temps et les ont chaque impression à la fois au bout de deux secondes, vous pouvez utiliser asyncio.gather: sur la boucle d'événements

async def main(): 
    await asyncio.gather(test(2), test(2), test(2)) 

Ce horaires trois test de coroutines au même temps et attend tous leurs résultats combinés, qui arriveront dans ~ 2 secondes.

Vous pouvez également tirer et oublier les coroutines sans attendre leur achèvement:

def main(): 
    asyncio.ensure_future(test(2)) 
    asyncio.ensure_future(test(2)) 
    asyncio.ensure_future(test(2))