多线程时出现“IOStream.flush timed out”错误

Mig*_*uel 7 python multithreading flush

我是 Python 编程新手,并且在多线程程序(使用“线程”模块)方面遇到问题,该程序一开始运行良好,但一段时间后开始重复打印“IOStream.flush 超时”错误。

我什至不知道如何调试这样的错误,因为我不知道哪一行导致了它。我读了一些有关此错误的信息,发现它可能与内存消耗有关,因此我尝试使用 Spyder IDE 上的内存分析器来分析我的程序。然而,我什么也没发现(尽管我承认,当涉及到 Python 内存泄漏时,我不确定要寻找什么)。

还有一些观察结果:

  • 我有一个外循环,可以在大量文件上运行我的函数。这些文件只是具有相同格式的数字数据(尽管它们很大,并且存在下载延迟,这就是为什么我将应用程序设为多线程,以便每个线程处理不同的文件)。如果我有很长的文件列表,就会出现问题。如果我缩短列表,程序就会毫无问题地结束。我不确定为什么会这样,尽管如果是某种内存泄漏,那么我会假设当我运行程序的时间更长时,问题会变得越来越严重,直到达到某种内存限制。

  • 通常,我在程序中使用128个线程。如果我将线程数减少到 48 个或更少,则程序可以正常工作并正确完成。很明显,问题是由多线程引起的(我正在使用“线程”模块)。这使得调试和找出导致问题的原因变得有点棘手。似乎 64 个线程左右的东西开始引起问题。

  • 该程序永远不会明确崩溃。一旦出现此错误,它就会不断重复打印“IOStream.flush timed out”。我必须关闭 Spyder IDE 才能停止它(重新启动内核不起作用)。

  • 就在发生此错误之前,程序似乎停止运行。至少控制台不再发生“打印”(各个线程都将调试信息打印到屏幕上)。最后打印的行是标准的调试/状态打印语句,通常在线程数量减少或要处理的文件数量减少时起作用。

我不知道如何调试它并找出问题的根源。任何有关如何深入了解此事的建议将不胜感激。提前致谢!

眼镜:

  • Python 3.8.8
  • 蜘蛛4.2.5
  • Windows 10