Python 的性能瓶颈与多线程并发
1. 为什么说python的多线程是假的?
Python 的解释器(CPython)有一个**全局解释器锁(GIL, Global Interpreter Lock)**机制。
它的作用是:同一时刻只允许一个线程执行 Python 字节码,以保证 Python 内部对象的内存安全。
结果:
- 在多线程模式下,Python 线程无法实现真正的并行执行(尤其是 CPU 密集型任务)。
- 这成为 Python 性能的一个重要瓶颈。
2. 真正的并行怎么办?
2.1 多进程(multiprocessing)
- 使用多进程(
multiprocessing),每个进程有自己的 Python 解释器和 GIL。 - 这样可以实现真正的并行。
2.2 其他 Python 实现–基本别考虑了
- 使用没有 GIL 的 Python 实现,比如 Jython、IronPython。
- 但这些实现的兼容性和生态远不如 CPython。
3. 既然是“假的多线程”,为什么 Python 还要提供多线程?
虽然 CPython 的多线程不能让 CPU 密集型任务并行,但它对I/O 密集型任务非常有用!
- 当一个线程在等待 I/O(如文件、网络)时,GIL 会被释放,其他线程可以继续执行。
- 这样可以让程序在 I/O 阻塞时不“傻等”,提升效率。
4. CPython、Jython、IronPython 是什么?(平常用的都是 Python3)
4.1 CPython
- 最常用的 Python 解释器。
- 你平时用的
python命令、Anaconda、PyCharm 里默认的都是 CPython。 - 用 C 语言实现。
- 支持绝大多数第三方库(如 numpy、pandas、requests 等)。
- 有 GIL,多线程不能并行执行 Python 代码。
4.2 Jython
- 用 Java 实现的 Python 解释器。
- 可以直接调用 Java 的类库。
- 没有 GIL,理论上多线程可以并行。
- 但不支持 C 扩展库(如 numpy、pandas),生态远不如 CPython。
4.3 IronPython
- 用 C# 实现的 Python 解释器。
- 可以直接调用 .NET 的类库。
- 没有 GIL,理论上多线程可以并行。
- 也不支持 C 扩展库,生态有限。
总结:
你平时用的几乎肯定是 CPython(除非你特意去装了 Jython 或 IronPython)。
你写的 Python 3 代码,绝大多数情况下都是在 CPython 上运行的。
Python伪多线程及并行解决方案
2348

被折叠的 条评论
为什么被折叠?



