【发布时间】:2014-12-12 13:08:17
【问题描述】:
该应用程序使用 Python 2.7 编写并在 Ubuntu 14.04 上运行。
它运行 50 个线程,一个线程占用所有 CPU(100% 使用率显示在 htop 中),其他线程永远没有机会继续执行。看起来调度程序无法更改为其他线程。这正常吗?
我应该尝试使用进程而不是线程吗?我在想,因为使用多处理,我可以使用更多的 CPU。
【问题讨论】:
标签: python multithreading
该应用程序使用 Python 2.7 编写并在 Ubuntu 14.04 上运行。
它运行 50 个线程,一个线程占用所有 CPU(100% 使用率显示在 htop 中),其他线程永远没有机会继续执行。看起来调度程序无法更改为其他线程。这正常吗?
我应该尝试使用进程而不是线程吗?我在想,因为使用多处理,我可以使用更多的 CPU。
【问题讨论】:
标签: python multithreading
https://wiki.python.org/moin/GlobalInterpreterLock
是的,multiprocessing 可能是在您的情况下实现事物的推荐方法。或者您可能会尝试重写挂起的线程,以便它不会占用太多 CPU(取决于 为什么 它会挂起,可能会很重要)。或者至少按照@user5402 的建议不时运行time.sleep(0)。
您也可能会发现有用的asyncio
【讨论】:
multiprocessing 时,会创建相应数量的系统进程并且每个进程独立工作,它是一个独立的python 解释器,彼此之间没有隐式关系。当然,这种情况下的问题是让它们互操作(即交换数据、同步状态、收集结果等)
asyncio,通常它是互联网服务等更合理的解决方案。
如果您知道哪个线程占用了 CPU,请尝试插入
time.sleep(0)
在它的主循环中的某个地方。这将导致它屈服于另一个可用线程。
该线程在做什么类型的工作?它在做任何 IO 吗? Python 线程在 IO-bound 任务上效果最好。对于 CPU 密集型任务,它可能永远不允许另一个线程运行。
【讨论】: