2017-08-01 65 views
1

考慮一個單線程的Python程序。名爲「first」的協程在I/O上被阻塞。隨後的指令是「等待第二個」。協程「第二」保證立即執行,直到它阻止I/O?或者,在「second」被調用之前,「first」是否可以繼續執行(由於I/O操作完成)?是否等待擔保執行令?

回答

1

Asyncio實現了一種方式,second將開始執行,直到它將控件返回到事件循環(通常發生在它到達某個I/O操作時),並且只有在first可以恢復之後。我不認爲它以某種方式向你保證,但很難相信這個實現也會改變。

如果由於某種原因你不想first繼續執行,直到second一些部分達到,它可能會更好明確使用Lock從你想一會兒才執行封鎖first

實施例顯示,當控制返回到事件循環和執行流程可以進行更改:

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() 

輸出:

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

謝謝。我主要關心'等待'和等待執行之間可能花費的時間。如果由於某些我不一定知道的I/O可能需要幾秒鐘,asyncio將毫無用處。我很高興。 – Terris