Python 3.5+支持带有关键字await和IO多路复用库asyncio的coroutinne。我是关于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()在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相结合。
发布于 2020-05-20 07:53:28
IO多路复用API(如select和epoll )支持超时。asyncio.sleep使用loop.call_later来确保超时结束后恢复其侍者。call_later的实现将唤醒时间添加到唤醒时间的有序列表中。当事件循环完成其迭代并进入睡眠时,它将等待一个协同线变为可运行的,如果:
因此,事件循环不是调用select([fd1, fd2, fd3]),而是调用select([fd1, fd2, fd3], timeout=next_wakeup_time - now)。在您的示例中,文件描述符列表将为空,或者仅由事件循环内部的文件描述符组成,以后唤醒时间将为1秒。
https://stackoverflow.com/questions/61905543
复制相似问题