【问题标题】:Multithread application hangs when one thread takes a 100% of CPU当一个线程占用 100% 的 CPU 时,多线程应用程序挂起
【发布时间】:2014-12-12 13:08:17
【问题描述】:

该应用程序使用 Python 2.7 编写并在 Ubuntu 14.04 上运行。

它运行 50 个线程,一个线程占用所有 CPU(100% 使用率显示在 htop 中),其他线程永远没有机会继续执行。看起来调度程序无法更改为其他线程。这正常吗?

我应该尝试使用进程而不是线程吗?我在想,因为使用多处理,我可以使用更多的 CPU。

【问题讨论】:

标签: python multithreading


【解决方案1】:

https://wiki.python.org/moin/GlobalInterpreterLock

是的,multiprocessing 可能是在您的情况下实现事物的推荐方法。或者您可能会尝试重写挂起的线程,以便它不会占用太多 CPU(取决于 为什么 它会挂起,可能会很重要)。或者至少按照@user5402 的建议不时运行time.sleep(0)

您也可能会发现有用的asyncio

【讨论】:

  • 其实我在线程代码上有很多 time.sleep(0) ,但我想要一个更一致的方式。
  • 当您使用multiprocessing 时,会创建相应数量的系统进程并且每个进程独立工作,它是一个独立的python 解释器,彼此之间没有隐式关系。当然,这种情况下的问题是让它们互操作(即交换数据、同步状态、收集结果等)
  • 关于如果python进程占用100% CPU会发生什么的问题。它将占用 100% 的单个内核(或真正的多处理器系统中的单个处理器),并且其他内核/处理器将可用于其他进程。如果您的任务可以很好地并行化(即它可以拆分为多个几乎独立的任务,不需要同步,或者等待 IO 或其他“共享资源”,那么理论上您可以获得 4 倍的加速。当然现实生活任务很少符合这些条件,但你总是可以发明更好的算法:)
  • 另外,您告诉过您的应用程序在 4CPU 系统中使用 50 个线程。这对我来说听起来很奇怪,因为 CPU 密集型任务无法以这样的比例有效处理(不超过 4 个线程/进程同时运行,因此其余 46 个必须等待)。如果您的应用程序以这种方式处理传入连接,那么您应该考虑asyncio,通常它是互联网服务等更合理的解决方案。
  • 即使进程根本没有锁,50/4 也只是系统调度程序的额外工作量,没有多大意义。当然是 YMMV,但我的经验表明,实现作业队列并将处理器数量限制在接近可用 CPU 内核的数量通常更合理。
【解决方案2】:

如果您知道哪个线程占用了 CPU,请尝试插入

time.sleep(0)

在它的主循环中的某个地方。这将导致它屈服于另一个可用线程。

该线程在做什么类型的工作?它在做任何 IO 吗? Python 线程在 IO-bound 任务上效果最好。对于 CPU 密集型任务,它可能永远不允许另一个线程运行。

【讨论】:

  • 理论上他们正在执行网络和 IO 绑定任务...但我最近停止了,因为一个使用大量 CPU 并且不允许其他线程执行的错误.所以理论上线程看起来是最好的选择,但我希望应用程序能够在这种情况下做出反应。例如,杀死耗时过长的进程。
猜你喜欢
  • 2014-05-05
  • 2013-12-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2018-09-02
相关资源
最近更新 更多