一位可靠的程序员朋友告诉我,Python 当前的多线程实现存在严重错误 - 足以完全避免使用。对于这个谣言,还能说些什么呢?

有帮助吗?

解决方案

Python 线程适用于 并发 I/O 编程. 。一旦线程阻塞等待来自文件、网络等的输入,它们就会被交换出 CPU。这允许其他 Python 线程在其他线程等待时使用 CPU。例如,这将允许您编写多线程网络服务器或网络爬虫。

然而,Python 线程是通过 吉尔 当他们进入解释器核心时。这意味着如果有两个线程正在处理数字,则在任何给定时刻只有一个线程可以运行。这也意味着您无法利用多核或多处理器架构。

有一些解决方案,例如使用基于 C 的线程库同时运行多个 Python 解释器。这不适合胆小的人,而且好处可能不值得麻烦。让我们期待未来版本中出现全 Python 解决方案。

其他提示

Python 的标准实现(通常称为 CPython,因为它是用 C 编写的)使用操作系统线程,但由于存在 全局解释器锁, ,一次只允许一个线程运行Python代码。但在这些限制范围内,线程库很强大并且被广泛使用。

如果您希望能够使用多个 CPU 核心,有几种选择。一种是同时使用多个Python解释器,正如其他人提到的。另一种选择是使用不使用 GIL 的不同 Python 实现。两个主要选项是 Jython铁蟒.

Jython 是用 Java 编写的,现在已经相当成熟,但仍然存在一些不兼容性。例如,网络框架 Django 还没有完美运行, ,但一直在接近。Jython 是 非常有利于线程安全, , 出来 在基准测试中表现更好 并有一个 给那些想要 GIL 的人的厚颜无耻的信息.

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

GIL(全局解释器锁)可能是个问题,但 API 相当不错。尝试一下优秀的 processing 模块,它为单独的进程实现线程 API。我现在正在使用它(尽管是在 OS X 上,但尚未在 Windows 上进行一些测试),并且给我留下了深刻的印象。Queue 类确实在管理复杂性方面节省了我的精力!

编辑:从 2.6 版开始,处理模块似乎已包含在标准库中(import multiprocessing)。喜悦!

据我所知,没有真正的错误,但是 cPython 中线程的性能非常糟糕(与大多数其他线程实现相比,但如果大多数线程都被阻塞,通常就足够好了),因为 吉尔 (全局解释器锁),所以实际上它是特定于实现的而不是特定于语言的。例如,Jython 由于使用 Java 线程模型而不会遇到此问题。

发布为什么从 cPython 实现中删除 GIL 并不可行,以及 一些实际的阐述和解决方法。

快速谷歌一下 “Python 吉尔” 了解更多信息。

如果您想使用 python 进行编码并获得出色的线程支持,您可能需要查看 IronPython 或 Jython。由于 IronPython 和 Jython 中的 python 代码分别在 .NET CLR 和 Java VM 上运行,因此它们享受这些库中内置的强大线程支持。除此之外,IronPython 没有 GIL,这是一个阻止 CPython 线程充分利用多核架构的问题。

我已经在多个应用程序中使用过它,并且从未听说过线程除了 100% 可靠之外还有其他任何性能,只要您知道它的局限性即可。您无法同时生成 1000 个线程并期望您的程序在 Windows 上正常运行,但是您可以轻松编写一个工作池并为其提供 1000 个操作,并保持一切正常并处于控制之下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top