【发布时间】:2021-08-02 13:13:37
【问题描述】:
我遇到了一个问题,我们编写的多线程下载应用程序有时会出现 408 错误。 我们认为这可能是因为用户增加了线程数,这导致了错误。我们认为有可能在网络调用过程中发生上下文切换,导致线程没有发送调用成功所需的所有数据包,并且服务器会出现 408 超时错误。 这是可能的还是网络调用不依赖于上下文切换。
我们正在使用 python 线程和 pycurl 模块使用 120 个线程来下载数据。
【问题讨论】:
-
Python 上下文切换不影响系统调用。更有可能是由于线程过多和 CPU 负载过多,网络调用之间的时间过长。
-
好的,如果 CS 不影响网络调用,那么 n=120 线程应该不是问题。我不明白您所说的网络调用之间的时间是什么意思?
-
对不起,让我们再看一遍。系统调用并没有真正受到影响(包括根据您的网络调用)。如果是这种情况,那么网络调用之间的时间是什么意思,因为那句话是矛盾的。在 64 核、128gb 内存的系统上运行 120 个线程不会导致过多的 cpu 负载。该程序使用不到 0.2% 的 cpu 和 300mb 的内存。
-
"我们认为有可能在网络调用期间,发生上下文切换,导致线程没有发送调用成功所需的所有数据包,并且服务器给出 408 超时错误.”你能告诉我们你为什么这么认为吗?上下文切换会导致出站数据不完整的信念的基础是什么? (是不是因为你知道你的代码对 TCP 数据将如何打包做出虚假假设?因为如果是这样,问题在于代码中的假设,而不是上下文切换!)
-
正如我所说,我不确定为什么会这样。我们无法控制服务器来找出服务器发送 408 的原因。这是一个思考过程,因为我们有很多线程,如果由于 GIL(全局解释器锁)一次只有一个线程在工作,我们认为可能是 CS 问题,但正如你所指出的, CS 对 N/W 调用没有影响。我们还使用了数据包嗅探器来确保我们所有的出站呼叫都带有完整的数据。也许这是我们正在调用的服务器上的可伸缩性问题。感谢您的支持。
标签: python multithreading pycurl