【发布时间】:2018-01-07 16:34:43
【问题描述】:
考虑一个单线程 Python 程序。一个名为“first”的协程在 I/O 上被阻塞。随后的指令是“等待第二个”。协程“第二”是否保证立即执行,直到它阻塞 I/O?或者,在调用“second”之前,“first”能否恢复执行(由于 I/O 操作已完成)?
【问题讨论】:
标签: python-asyncio
考虑一个单线程 Python 程序。一个名为“first”的协程在 I/O 上被阻塞。随后的指令是“等待第二个”。协程“第二”是否保证立即执行,直到它阻塞 I/O?或者,在调用“second”之前,“first”能否恢复执行(由于 I/O 操作已完成)?
【问题讨论】:
标签: python-asyncio
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
【讨论】: