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