一位可靠的编码朋友告诉我,Python当前的多线程实现严重错误 - 足以避免完全使用.关于这个谣言怎么说?
Python线程适用于并发I/O编程.一旦阻塞等待来自文件,网络等的输入,线程就会被换出CPU.这允许其他Python线程使用CPU而其他人则等待.例如,这将允许您编写多线程Web服务器或Web爬网程序.
但是,当GIL进入解释器核心时,它们会被GIL序列化.这意味着如果两个线程正在处理数字,则只有一个线程可以在任何给定时刻运行.这也意味着您无法利用多核或多处理器架构.
有一些解决方案,比如使用基于C的线程库同时运行多个Python解释器.这不适合胆小的人,这些好处可能不值得.让我们希望在将来的版本中使用所有Python解决方案.
该标准的Python实现(通常被称为CPython的,因为它是用C语言编写)使用OS线程,但由于是全局解释器锁,每次只允许一个线程来运行Python代码.但是在这些限制内,线程库是健壮的并且被广泛使用.
如果您希望能够使用多个CPU核心,则有几个选项.一种是同时使用多个python解释器,如其他人所提到的.另一个选择是使用不使用GIL的Python的不同实现.两个主要选项是Jython和IronPython.
Jython是用Java编写的,现在已经相当成熟了,尽管仍然存在一些不兼容性.例如,Web框架Django还没有完美运行,但是它一直在变得越来越近.Jython 非常适合线程安全,在基准测试中表现更好,并且对那些想要GIL的人有一个厚颜无耻的信息.
IronPython使用.NET框架并使用C#编写.兼容性正在达到Django可以在IronPython上运行的阶段(至少作为演示),并且有在IronPython中使用线程的指南.
GIL(全局解释器锁)可能是一个问题,但API非常好.试用优秀的processing
模块,它为不同的进程实现Threading API.我现在正在使用它(尽管在OS X上,还没有在Windows上进行一些测试)并且给我留下了深刻的印象.在管理复杂性方面,Queue类实际上是在节省我的培根!
编辑:从版本2.6(import multiprocessing
)开始,标准库中包含处理模块.喜悦!
据我所知,没有真正的错误,但是在cPython中进行线程化时的性能非常糟糕(与大多数其他线程实现相比,但如果所有大多数线程都是阻塞的话通常都足够好)由于GIL(全局解释器)锁定),所以实际上它是特定于实现而不是特定于语言.例如,由于使用Java线程模型,Jython不会受此影响.
请参阅这篇文章,了解为什么从cPython实现中删除GIL是不可行的,这是一些实际的详细说明和解决方法.
快速谷歌"Python GIL"获取更多信息.