首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.5异步解释器如何处理“挂起的”corutines

Python3.5异步解释器如何处理“挂起的”corutines
EN

Stack Overflow用户
提问于 2016-11-25 07:44:19
回答 1查看 254关注 0票数 4

我对异步技术还很陌生,并试图了解它的实际工作原理。

假设我们有两种香菜,其中一种看起来是这样的:

代码语言:javascript
复制
async def f():
    await sleep(10)
    print('something')

显然,sleep()可能是任何IO操作。如果我正确理解了这段代码,我们就开始执行sleep(10),并将上下文切换到其他路径(如果存在的话)。

但是,如果这个协同线被暂停了,解释器如何“计算”10秒呢?或者当coroutine被暂停时,解释器如何处理一些IO响应?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-26 02:08:57

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

每个协同线都由asyncio.Task执行。未来会变成任务运行者(实际上是Task._step())。跑步者添加了一个回调到泡沫化的未来,以便在将来完成时唤醒自己。

sleep()实现非常简单:

代码语言:javascript
复制
@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等待完成时,给定的值(或异常)被分配给未来,任务运行程序被唤醒,挂起的协同线被恢复。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40799981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档