为什么我的Python程序每个进程只使用33%的CPU?如何让Python充分利用所有CPU?

16 投票
8 回答
39777 浏览
提问于 2025-04-15 16:04

我用的是Python 2.5.4。我的电脑配置是:CPU是AMD Phenom X3 720BE,主板是780G,内存4GB,操作系统是32位的Windows 7。

我在用Python的多线程功能,但我发现每个python.exe进程的CPU使用率都不能达到100%。为什么它们平均只使用了大约33-34%的CPU呢?

我希望能把所有可用的计算机资源都用在这些大计算上,以便尽快完成它们。

编辑:谢谢大家!现在我在使用Parallel Python,一切都运转得很好。我的CPU现在总是保持在100%使用率。谢谢大家!

8 个回答

12

全局解释器锁

使用这种锁的原因包括:

* increased speed of single-threaded programs (no necessity to acquire or release locks
  on all data structures separately)
* easy integration of C libraries that usually are not thread-safe.

用有全局解释器锁(GIL)语言写的应用程序,必须使用不同的进程(也就是解释器)来实现完全的并发,因为每个解释器都有自己的全局解释器锁。

25

可以试试 multiprocessing 模块。虽然Python有真正的线程,但在持有全局解释器锁(GIL)时,它会限制这些线程的同时使用。如果你需要更快的速度,可以考虑写一个C语言的扩展模块,然后从Python中调用它的函数。在这些C语言函数中,你可以释放GIL。

另外,建议看看David BeazleyMindblowing GIL

39

看起来你有一个3核的CPU。如果你想在原生的Python代码中使用多个CPU核心,你需要启动多个进程。(两个或更多的Python线程不能同时在不同的CPU上运行)

正如R. Pate所说,Python的multiprocessing模块是一种方法。不过,我建议你可以看看Parallel Python。这个工具可以帮助你分配任务和传递信息。你甚至可以在很多不同的电脑上运行任务,只需对代码做很少的修改。

使用起来非常简单:

import pp

def parallel_function(arg):
    return arg

job_server = pp.Server() 

# Define your jobs
job1 = job_server.submit(parallel_function, ("foo",))
job2 = job_server.submit(parallel_function, ("bar",))

# Compute and retrieve answers for the jobs.
print job1()
print job2()

撰写回答