关于Python GIL的问题
Python中的全局解释器锁(GIL)的存在,是否意味着在Python的多线程中,执行相同的操作和在单线程中重复执行并没有太大区别呢?
举个例子,如果我需要上传两个文件,使用两个线程上传和一个接一个上传有什么好处呢?
我尝试了用这两种方式进行一个复杂的数学运算,但它们完成的时间似乎差不多。
这让我感到有些困惑。有人能帮我解答一下吗?谢谢。
4 个回答
这要看正在执行的本地代码模块。某些本地模块可以释放全局解释器锁(GIL),然后去做自己的事情,这样其他线程就可以获得这个锁。通常情况下,当Python代码和本地代码在处理Python对象时,GIL是被保持的。如果你想了解更多细节,可能需要花点时间去阅读相关资料。:)
参考链接: 什么是全局解释器锁(GIL)? 和 线程状态和全局解释器锁
这其实要看你使用的库。GIL是为了防止Python对象和内部数据结构同时被修改。如果你在进行上传操作,你用来实际上传的库可能会在等待HTTP请求完成时释放GIL(我猜标准库中的HTTP模块是这样,但我没有确认过)。
顺便说一下,如果你真的想让事情并行运行,最简单的办法就是使用多个进程。这样可以省去很多麻烦,而且你最终写出的代码会更好(更稳健、更具扩展性,结构也可能更清晰)。
Python的线程有时候被误解得比较糟糕,其实它们有几个地方是有好处的(可以说是三个,实际上是两个半)。
如果有非Python的代码在运行(比如C语言写的库,或者操作系统内核等),其他的Python线程可以继续执行。只有纯Python代码不能同时在两个线程中运行。所以如果你在做磁盘操作或者网络传输,线程确实能帮你,因为大部分时间都是在Python之外的。
所谓的全局解释器锁(GIL)其实并不是Python的一部分,而是CPython的一个实现细节。CPython是核心Python开发者工作的“参考”版本,通常你在Linux上运行“python”时就是这个版本。
像Jython、IronPython以及其他一些Python的重新实现版本通常是没有GIL的,这样多个纯Python线程就可以同时运行。
至于那个0.5的情况:即使你完全使用纯Python,并且从线程中几乎看不到性能提升,有些问题用线程来解决在开发时间和难度上会更方便。这当然也和开发者本身的能力有关。