gpt4 book ai didi

python - 提高多线程 Web 服务器的性能

转载 作者:行者123 更新时间:2023-12-01 04:44:04 24 4
gpt4 key购买 nike

我正在为一个简单的 Python 多线程 Web 服务器构建一个负载生成器。负载生成器采用用户提供的线程数,启动客户端,连接到服务器并请求短文件,然后断开连接。服务器为每个新的客户端连接创建一个新线程。

发生的情况是我能够实例化大约 100 个客户端线程,没有任何问题。但是当我将其增加到 1000 个或更多线程时,我会得到不良结果。我收到以下错误:

  • 错误:[Errno 32] 管道损坏,当客户端调用 sendall 时,
  • 错误:当客户端调用 recv 时,[Errno 54] 连接被对等方重置

发生了什么事以及处理这些错误的正确方法是什么?

编辑
显然,我可以捕获这些套接字错误。仅仅捕获上述错误是否合适,还是应该对其进行处理?如果要处理的话,应该如何处理?这些错误并不罕见或随机发生;每当我的负载生成器产生 > ~100 个线程时,它们就会一致地发生。

我现在明白,当套接字的接收端已关闭,然后写入端尝试写入时,会发生 [Errno 32] 管道损坏。在这种情况下,接收端(服务器端)将过早关闭,但我不确定如何防止这种情况发生,或者是否有办法。

最佳答案

这实际上可能反射(reflect)了相关简单多线程 Web 服务器的负载限制。

CPython 是标准 Python 实现,不使用多个内核进行多线程处理,因为它的 global interpreter lock (GIL) 。因此,诸如应答 HTTP 请求负载之类的计算密集型任务不会表现得那么好。

要提高并行性能,您可以:

  • 使用多处理,例如 multiprocessing ,
  • 使用没有此类线程限制的替代 Python 实现,例如 Jython ,
  • 使用一些替代的并发方法,例如微线程如 Greenlet ,事件循环如 Twisted等等

生产级 Web 服务器通常使用这两个选项,使用多个工作进程,每个进程运行多个线程。

关于python - 提高多线程 Web 服务器的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29879927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com