1
考慮一個單線程的Python程序。名爲「first」的協程在I/O上被阻塞。隨後的指令是「等待第二個」。協程「第二」保證立即執行,直到它阻止I/O?或者,在「second」被調用之前,「first」是否可以繼續執行(由於I/O操作完成)?是否等待擔保執行令?
考慮一個單線程的Python程序。名爲「first」的協程在I/O上被阻塞。隨後的指令是「等待第二個」。協程「第二」保證立即執行,直到它阻止I/O?或者,在「second」被調用之前,「first」是否可以繼續執行(由於I/O操作完成)?是否等待擔保執行令?
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
謝謝。我主要關心'等待'和等待執行之間可能花費的時間。如果由於某些我不一定知道的I/O可能需要幾秒鐘,asyncio將毫無用處。我很高興。 – Terris