python 3.5异步IO解释器如何处理';暂停';科鲁廷
我是asyncio的新手,试图了解它实际上是如何工作的 假设我们有两个corutine,其中一个看起来像这样:python 3.5异步IO解释器如何处理';暂停';科鲁廷,python,python-3.5,python-asyncio,Python,Python 3.5,Python Asyncio,我是asyncio的新手,试图了解它实际上是如何工作的 假设我们有两个corutine,其中一个看起来像这样: async def f(): await sleep(10) print('something') 显然,任何IO操作都可以代替sleep()。 如果我对这段代码理解正确,我们就开始执行sleep(10),并将上下文切换到其他一些coutroutine(如果它存在的话) 但是,如果这个协同程序被暂停,解释器如何“计算”这10秒呢?或者解释器如何处理某些IO响应,如果它
async def f():
await sleep(10)
print('something')
显然,任何IO操作都可以代替sleep()
。
如果我对这段代码理解正确,我们就开始执行sleep(10)
,并将上下文切换到其他一些coutroutine(如果它存在的话)
但是,如果这个协同程序被暂停,解释器如何“计算”这10秒呢?或者解释器如何处理某些IO响应,如果它发生在协程挂起时?内部
asyncio.sleep()
返回一个未来的对象。
未来值将在超时过期后设置
每个协同程序都由asyncio.Task
执行。未来是由任务运行程序(实际上是task.\u step()
task)决定的。
运行程序向冒泡的未来添加回调,以便在未来完成时唤醒自己
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()
Task runner比beast复杂得多,但其源代码仍然可读:
每个阻塞IO也会返回一个未来(可能来自非常深的内部调用)。当IO等待完成时,给定的值(或异常)被分配给未来,任务运行程序被唤醒,暂停的协同路由被恢复。是!修好了,谢谢。