Python线程是否有bug?

28 投票
6 回答
12612 浏览
提问于 2025-04-10 23:14

我有个靠谱的程序员朋友告诉我,Python现在的多线程功能有很多问题,严重到让人根本不想用。关于这个传闻,我们该怎么说呢?

6 个回答

9

全局解释器锁(GIL)可能会带来一些问题,但这个接口还是挺不错的。你可以试试很棒的 processing 模块,它为不同的进程实现了线程API。我现在就正在用这个模块(虽然是在OS X上,Windows上还没测试过),效果让我很满意。Queue类在管理复杂性方面真是帮了我大忙!

补充说明:看起来从2.6版本开始,processing模块就被包含在标准库里了(import multiprocessing)。太好了!

16

Python的标准实现,通常叫做CPython,因为它是用C语言写的。它使用操作系统的线程,但由于有一个叫做全局解释器锁的东西,导致一次只能有一个线程在运行Python代码。不过,在这个限制下,Python的线程库还是很强大且被广泛使用。

如果你想利用多个CPU核心,有几种选择。一个是同时使用多个Python解释器,正如其他人提到的那样。另一个选择是使用不带全局解释器锁的Python实现。主要有两个选项:JythonIronPython

Jython是用Java写的,现在已经相当成熟,虽然仍然有一些不兼容的地方。例如,网络框架Django还不能完美运行,但一直在不断接近。Jython在线程安全性方面表现很好,在基准测试中表现更佳,并且对那些想要全局解释器锁的人有个调皮的信息

IronPython是用C#写的,使用的是.NET框架。它的兼容性已经达到一个阶段,Django可以在IronPython上运行(至少作为演示),并且有关于在IronPython中使用线程的指南

58

Python 的线程在处理同时进行的输入输出操作时表现得很好。当线程在等待文件、网络等输入时,它们会被暂时从 CPU 中移除。这样,其他的 Python 线程就可以利用 CPU 进行工作,而不必等着。这就意味着你可以写一个多线程的网页服务器或者网页爬虫。

不过,Python 的线程在进入解释器核心时会受到一个叫做GIL的东西的限制。这就意味着如果有两个线程在进行复杂的计算,任何时刻只能有一个线程在运行。这也意味着你无法充分利用多核或多处理器的系统。

有一些解决方案,比如同时运行多个 Python 解释器,或者使用基于 C 的线程库。但这些方法不太适合新手,而且可能带来的好处也不一定值得付出这么多努力。希望未来的版本能提供一个完全基于 Python 的解决方案。

撰写回答