考虑单线程Python程序。名为“first”的协程在I / O上被阻止。随后的指令是“等待第二个”。协程“第二”是否保证立即执行,直到它阻塞在I / O上?或者,在调用“second”之前,可以“首先”继续执行(由于I / O操作完成)?
答案 0 :(得分:1)
Asyncio实现了second
将开始执行的方式,直到它将控制返回到事件循环(它通常在它到达某些I / O操作时发生)并且只有在first
可以恢复之后。我不认为它会以某种方式向你保证,但很难相信这种实现也会改变。
如果出于某种原因,您不希望first
在second
的某些部分到达之前继续执行,则可能更明确地使用Lock来阻止first
在您想要的时刻之前执行。{/ p>
显示何时控制返回事件循环并且可以更改执行流程的示例:
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