2016-11-25 56 views
3

我是新来的asyncio并试图了解它是如何工作的。python 3.5 asyncio解释器如何处理“暂停”的corutines

比方说,我们有两个corutines,其中一个看起来是这样的:

async def f(): 
    await sleep(10) 
    print('something') 

代替sleep()可以是任何IO操作,效果显着。 如果我理解了这段代码,我们开始执行sleep(10)并将上下文切换到其他一些couroutine(如果存在)。

但是,如果此协程已被暂停,解释程序如何“计数”10秒?或者如何解释器处理一些IO响应,如果它在协程被暂停时发生?

+0

是的!修正了,谢谢。 – Paul

回答

3

内部asyncio.sleep()返回Future对象。 未来的值将在超时过期后设置。

每个协同程序asyncio.Task执行。未来冒出来的任务亚军(实际上是Task._step())。 奔跑者增加了一个回调来冒泡未来在将来完成时醒来。

sleep()实现很简单:

@coroutine 
def sleep(delay, result=None, *, loop=None): 
    """Coroutine that completes after a given time (in seconds).""" 
    if delay == 0: 
     yield 
     return result 

    if loop is None: 
     loop = events.get_event_loop() 
    future = loop.create_future() 
    h = future._loop.call_later(delay, 
           futures._set_result_unless_cancelled, 
           future, result) 
    try: 
     return (yield from future) 
    finally: 
     h.cancel() 

任务运行是兽要复杂得多,但它的源代码仍然可读:https://github.com/python/asyncio/blob/master/asyncio/tasks.py#L223-L300

每阻塞IO太(也许从很深的内部调用返回一个未来)。当IO等待完成时,给定的值(或例外)被分配给将来,任务运行器被唤醒并且暂停协程被恢复。

+0

太好了,谢谢! – Paul