python - 减少网络服务器中的 I/O 延迟——在 python 中使用 select 时是否需要 asyncio?
问题描述
众所周知,大多数 Web 服务器都是 I/O 受限程序,在接收/发送命令之前等待套接字读/写就绪。
现在,我正在编写一个 python 网络服务器程序。它使用select
函数来轮询套接字是否已准备好读/写,从而强制send
和recv
非阻塞,从而显着减少使用这些命令的 I/O 延迟。
在这种情况下——使用 asyncio 是否会进一步减少 I/O 延迟?或者它只会降低 CPU 使用率(这只能在 CPU 受限的程序中有所帮助)?
解决方案
使用 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 的框架。
编码风格相当不同,你必须习惯。结果应该会更好,并且您将拥有许多用于抽象常见任务的库。
推荐阅读
- qt - 用 VS2019 构建 QT4.8.6 会报错
- c++ - 索引的指针泛化
- visual-studio-code - 如何在 VSCode 中使所有制表符长度相同?
- mysql - MySQL-Simple Query 需要 11 秒才能返回结果
- android - 为什么android房间抛出CursorWindowAllocationException?
- vue.js - 基于 webpack 应用的动态 vue-router
- php - PHP检查数组是否包含多个值
- python - ConnectionResetError: [WinError 10054] 连接被远程主机中止
- kubernetes - Kubernetes 部署消除了持久卷
- c++ - 不断降低内存分配效率。代码示例