我对异步技术还很陌生,并试图了解它的实际工作原理。
假设我们有两种香菜,其中一种看起来是这样的:
async def f():
await sleep(10)
print('something')显然,sleep()可能是任何IO操作。如果我正确理解了这段代码,我们就开始执行sleep(10),并将上下文切换到其他路径(如果存在的话)。
但是,如果这个协同线被暂停了,解释器如何“计算”10秒呢?或者当coroutine被暂停时,解释器如何处理一些IO响应?
发布于 2016-11-26 02:08:57
在内部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等待完成时,给定的值(或异常)被分配给未来,任务运行程序被唤醒,挂起的协同线被恢复。
https://stackoverflow.com/questions/40799981
复制相似问题