2017-08-01 2 views
1

Considérons un programme Python à un seul thread. Un coroutine nommé "first" est bloqué sur les E/S. L'instruction suivante est "attendre deuxième". Est-ce que le "deuxième" coroutine est garanti d'être exécuté immédiatement jusqu'à ce qu'il bloque sur les E/S? Ou, peut "reprendre" d'abord l'exécution (en raison de l'achèvement de l'opération d'E/S) avant que "second" soit invoqué?Vous attendez l'ordre d'exécution de la garantie?

Répondre

1

Asyncio a implémenté une manière que second commencerait à s'exécuter jusqu'à ce qu'il renvoie le contrôle à la boucle d'événement (cela arrive généralement quand il atteint une opération d'E/S) et seulement après first peut être repris. Je ne pense pas que cela vous soit garanti, mais je ne crois pas que cette implémentation soit modifiée non plus.

Si pour une raison quelconque, vous ne voulez pas first de reprendre l'exécution jusqu'à ce qu'une partie de second atteint, il est probablement préférable d'utiliser explicitement Lock pour bloquer first avant d'exécuter moment souhaité.

exemple pour montrer quand le contrôle revient à la boucle d'événements et le flux d'exécution peuvent être modifiés:

import asyncio 


async def async_print(text): 
    print(text) 


async def first(): 
    await async_print('first 1') 
    await async_print('first 2') 
    await asyncio.sleep(0) # returning control to event loop 
    await async_print('first 3') 


async def second(): 
    await async_print('second 1') 
    await async_print('second 2') 
    await asyncio.sleep(0) # returning control to event loop 
    await async_print('second 3') 


async def main(): 
    asyncio.ensure_future(first()) 
    asyncio.ensure_future(second()) 
    await asyncio.sleep(1) 


loop = asyncio.new_event_loop() 
asyncio.set_event_loop(loop) 
try: 
    loop.run_until_complete(main()) 
finally: 
    loop.run_until_complete(loop.shutdown_asyncgens()) 
    loop.close() 

Sortie:

first 1 
first 2 
second 1 
second 2 
first 3 
second 3 
+0

Merci. J'étais surtout préoccupé par le temps qui pouvait s'écouler entre l'attente et l'exécution du thingy attendu. Si cela peut prendre quelques secondes à cause de certaines E/S dont je ne suis pas nécessairement au courant, asyncio serait inutile. Je suis heureux. – Terris