Python是否能在多核上运行?

97 投票
7 回答
176273 浏览
提问于 2025-04-17 03:01

问题:由于Python使用了“全局解释器锁”(GIL),那么Python能否同时运行它的多个线程呢?


信息:

在阅读了这篇文章后,我对Python是否能利用多核处理器感到有些不确定。虽然Python做得很好,但想到它可能缺乏这样强大的能力,感觉真的很奇怪。所以我决定在这里问一下。如果我写一个多线程的程序,它能否在多个核心上同时执行呢?

7 个回答

14

CPython(就是最常用的Python版本)不能让多个线程同时执行Python的字节码。这意味着,如果你的程序主要在进行计算,它只能使用一个处理器核心。虽然在进行输入输出操作或者在C扩展(比如numpy)里进行计算时,可以同时进行。

其他的Python实现(比如Jython或PyPy)可能会有不同的表现,我对它们的具体情况不太了解。

通常的建议是使用多个进程,而不是多个线程。

51

Python的线程无法充分利用多个核心。这是因为Python的C实现(也就是大家常用的cPython)内部有个叫做GIL(全局解释器锁)的东西,导致这个问题。

解决这个问题的方法是使用multiprocessing模块,http://www.python.org/dev/peps/pep-0371/就是为了这个目的开发的。

文档链接:http://docs.python.org/library/multiprocessing.html

(或者可以使用其他支持并行的编程语言。)

89

答案是“可以,但...”

不过,当你使用常规线程来处理并发时,cPython就做不到这一点。

你可以使用一些工具,比如 multiprocessingcelery 或者 mpi4py,把并行的工作分配到另一个进程中去;

或者你可以使用像 Jython 或者 IronPython 这样的替代解释器,它们没有全局解释器锁(GIL)。

一个更简单的解决办法是使用一些库,这些库在处理重的CPU任务时不会受到GIL的限制。例如,numpy 可以处理大量计算,而不会保留GIL,这样其他的Python线程就可以继续运行。你也可以用 ctypes 库来实现类似的效果。

如果你做的工作不是很占用CPU,那么你可以几乎完全忽略GIL的问题,因为在等待输入输出(IO)时,Python不会占用GIL。

撰写回答