等待保证执行顺序吗?

时间:2017-08-01 00:22:49

标签: python-asyncio

考虑单线程Python程序。名为“first”的协程在I / O上被阻止。随后的指令是“等待第二个”。协程“第二”是否保证立即执行,直到它阻塞在I / O上?或者,在调用“second”之前,可以“首先”继续执行(由于I / O操作完成)?

1 个答案:

答案 0 :(得分:1)

Asyncio实现了second将开始执行的方式,直到它将控制返回到事件循环(它通常在它到达某些I / O操作时发生)并且只有在first可以恢复之后。我不认为它会以某种方式向你保证,但很难相信这种实现也会改变。

如果出于某种原因,您不希望firstsecond的某些部分到达之前继续执行,则可能更明确地使用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