Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
通过IO多路复用实现协同路由等待的Python3.5策略是什么?_Python_Async Await_Python Asyncio - Fatal编程技术网

通过IO多路复用实现协同路由等待的Python3.5策略是什么?

通过IO多路复用实现协同路由等待的Python3.5策略是什么?,python,async-await,python-asyncio,Python,Async Await,Python Asyncio,Python 3.5+支持带有关键字wait和IO多路复用库asyncio的协同路由。我对python3.5+如何实现与IO多路复用的协程感到困惑 例如,我们有两个功能: #example-1 async def f1(x, y): for i in range(10): r = await x + y print(r) async def f2(x, y): for i in range(10): await asyncio.sleep(1.0)

Python 3.5+支持带有关键字wait和IO多路复用库asyncio的协同路由。我对python3.5+如何实现与IO多路复用的协程感到困惑

例如,我们有两个功能:

#example-1 

async def f1(x, y):
  for i in range(10):
    r = await x + y
    print(r)

async def f2(x, y):
  for i in range(10):
    await asyncio.sleep(1.0)
    r = await f1(x, y)
    print(r)

if __name__ == '__main__':
  import asyncio
  loop = asyncio.get_event_loop()
  loop.run_until_complete(f2(1, 2))
  loop.close()
在示例1中,我们只有一个线程,当函数f1执行到line await asyncio.sleep1.0时,f1将释放CPU并休眠1秒。函数f2将获得CPU并继续,当f2执行到line WAIT ASYCIO.sleep1.0时,它还将释放CPU并休眠1秒


假设以上所有内容都是正确的,我对这个特性如何与IO多路复用结合感到困惑。据我所知,IO多路复用是由系统API(如select/epoll/kqueue)实现的,但我没有看到任何文件描述符与示例1相结合。

IO多路复用API(如select和epoll)支持超时。asyncio.sleep稍后使用loop.call_,以确保超时后恢复等待程序。call_的实现稍后会将唤醒时间添加到有序的唤醒时间列表中。当事件循环完成其迭代并进入睡眠状态时,它会等待协同路由变为可运行,如果:

某个协同程序感兴趣的文件描述符发生了某些问题,或者 到达协同程序注册的下一个唤醒时间。
因此,事件循环调用select[fd1,fd2,fd3],而不是调用select[fd1,fd2,fd3],timeout=next_wakeup_time-now。在您的情况下,文件描述符列表将为空,或者仅由事件循环内部的文件描述符组成,并且唤醒时间将为1秒。

对于其他表达式,例如:c=await a+b或r=await some函数,python如何计算下一次唤醒时间?@linrongbin next wakeup time是为整个事件循环计算的,简单地说就是按时间顺序排在第一位的唤醒时间。如果某些函数安排唤醒或等待其他安排唤醒并挂起的内容,则其唤醒将添加到已排序的唤醒列表中。一旦达到该时间,任务将恢复。请参阅,了解如何将所有内容结合在一起的现场演示。本次讲座使用了较旧的syntax而不是Wait,但不要因此而放弃,其机制完全相同。我看过关于PyCon 2015的讲座,非常棒。但是我没有找到任何关于python如何决定下一个唤醒时间的关于yield或wait表达式的信息。@linrongbin你说得对,他的实现受到讲座时间的限制,所以不包括睡眠。在他的模型中,睡眠协同程序可以产生类似于sleep_until、wakeup_time的内容,事件循环将最快唤醒时间指定为timeout。谢谢,我想我会阅读实现,谢谢分享!我认为编辑后的代码会出现异常,因为它等待的是一个数字,而这个数字是不可等待的。