首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过IO复用实现coroutine的python3.5策略是什么?

通过IO复用实现coroutine的python3.5策略是什么?
EN

Stack Overflow用户
提问于 2020-05-20 05:09:39
回答 1查看 214关注 0票数 0

Python 3.5+支持带有关键字await和IO多路复用库asyncio的coroutinne。我是关于python3.5+是如何用IO多路复用实现协同工作的。

例如,我们有两个函数:

代码语言:javascript
复制
#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()

example-1中只有一个线程,当函数f1执行到行await asyncio.sleep(1.0)时,f1将释放CPU并休眠1秒。函数f2将获得CPU并继续,当f2执行到行await asyncio.sleep(1.0)时,它也将释放CPU并睡眠1秒。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-20 07:53:28

IO多路复用API(如selectepoll )支持超时。asyncio.sleep使用loop.call_later来确保超时结束后恢复其侍者。call_later的实现将唤醒时间添加到唤醒时间的有序列表中。当事件循环完成其迭代并进入睡眠时,它将等待一个协同线变为可运行的,如果:

  • 在coroutine已经注册的文件描述符上发生了一些事情,或者达到了
  • --由coroutine注册的下一个唤醒时间。

因此,事件循环不是调用select([fd1, fd2, fd3]),而是调用select([fd1, fd2, fd3], timeout=next_wakeup_time - now)。在您的示例中,文件描述符列表将为空,或者仅由事件循环内部的文件描述符组成,以后唤醒时间将为1秒。

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

https://stackoverflow.com/questions/61905543

复制
相关文章

相似问题

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