首页 > 解决方案 > 减少网络服务器中的 I/O 延迟——在 python 中使用 select 时是否需要 asyncio?

问题描述

众所周知,大多数 Web 服务器都是 I/O 受限程序,在接收/发送命令之前等待套接字读/写就绪。

现在,我正在编写一个 python 网络服务器程序。它使用select函数来轮询套接字是否已准备好读/写,从而强制sendrecv非阻塞,从而显着减少使用这些命令的 I/O 延迟。

在这种情况下——使用 asyncio 是否会进一步减少 I/O 延迟?或者它只会降低 CPU 使用率(这只能在 CPU 受限的程序中有所帮助)?

标签: pythonsocketspython-asyncio

解决方案


使用 select() 时不需要 asyncio

通常,您要么使用 select() 编写应用程序,要么使用 asyncio。

使用 select 是异步解决方案的“手动”方法。基本上,您手动编写所有代码,然后使用 if 语句/查找表执行调度。

Asyncio 是用于实现异步应用程序的更高级别的方法,并且具有许多功能,可以帮助您编写异步 Web 服务器或其他服务器。

Asyncio 可能不会直接使用 select(),而是取决于它的事件循环及其相关的选择器 ( https://docs.python.org/3/library/selectors.html#module-selectors ) KqueueSelector、EpollSelector…</p >

我认为使用 asyncio 编码会更容易,但是您必须学习它或至少一个基于 asyncio 的框架。

编码风格相当不同,你必须习惯。结果应该会更好,并且您将拥有许多用于抽象常见任务的库。


推荐阅读