考虑一个单线程的Python程序。名为"first“的协程在I/O上被阻塞。随后的指令是"await second”。是否保证协程“秒”立即执行,直到它阻塞I/O?或者,在调用"second“之前,"first”是否可以恢复执行(由于I/O操作完成)?
发布于 2017-08-01 15:12:11
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 3https://stackoverflow.com/questions/45427152
复制相似问题