Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 3.5异步IO解释器如何处理';暂停';科鲁廷_Python_Python 3.5_Python Asyncio - Fatal编程技术网

python 3.5异步IO解释器如何处理';暂停';科鲁廷

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响应,如果它

我是asyncio的新手,试图了解它实际上是如何工作的

假设我们有两个corutine,其中一个看起来像这样:

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等待完成时,给定的值(或异常)被分配给未来,任务运行程序被唤醒,暂停的协同路由被恢复。

是!修好了,谢谢。