2017-08-01 66 views
1

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

回答

1

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 
+0

谢谢。我主要关心'等待'和等待执行之间可能花费的时间。如果由于某些我不一定知道的I/O可能需要几秒钟,asyncio将毫无用处。我很高兴。 – Terris