【发布时间】:2019-10-09 12:09:46
【问题描述】:
众所周知,大多数网络服务器都是 I/O 受限程序,在接收/发送命令之前等待套接字读/写就绪。
现在,我正在编写一个 python 网络服务器程序。它使用select 函数来轮询套接字是否已准备好读/写,从而强制send 和recv 非阻塞,从而显着减少使用这些命令的I/O 延迟。
在这种情况下,使用 asyncio 是否会进一步减少 I/O 延迟?或者它只是减少 CPU 使用率(这只能在 CPU 受限的程序中有所帮助)?
【问题讨论】:
-
它们的速度可能会略有不同,具体取决于每个 web 请求的后端任务。但是因为 asyncio 可以让繁重/长时间运行的请求在一边运行,这将为您的用户提供快速体验。其中,在前一个请求完成之前, select 不会处理下一个请求。 (长话短说,还有更多内容,这是您要问的一个非常复杂的问题。这完全取决于您的实现、用例、服务器等)
-
如果每个 webrequest 的后端任务很高 - 是否认为是 CPU 受限程序?
-
不确定
CPU bounded-program是什么意思。 -
一个不等待IO(如recv和send)完成的程序,即它的大部分CPU时间它使用算术和逻辑运算,这使得程序是CPU密集型的。
-
select 是异步解决方案的“手动”方法。基本上,您手动编写所有代码。 Asyncio 是用于实现异步应用程序的更高级别的方法。并且可以有很多功能,可以帮助您编写异步 Web 服务器。它可能不会直接使用 select,但取决于它的事件循环及其相关的选择器 (docs.python.org/3/library/selectors.html#module-selectors) (KqueueSelector, EpollSelector…
标签: python sockets python-asyncio