【问题标题】:Reducing I/O latency in webservers- does asyncio is needed when using select in python?减少网络服务器中的 I/O 延迟 - 在 python 中使用 select 时是否需要 asyncio?
【发布时间】:2019-10-09 12:09:46
【问题描述】:

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

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


【解决方案1】:

使用 select() 时不需要 asyncio

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2020-01-13
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多