Python‘s hardest problem 阅读笔记
该文主要讲了GIL,在此记录自己的总结
- Python 作为解释型语言,不像C语言这样的编译型语言。编译型语言的代码会通过编译器成为机器码,编译器可以一次看到完整的代码,进而可以做出很多优化。而解释型语言的代码会经过解释器,由解释器逐行解释执行,解释器不能一下子看到完整代码,所以对代码的优化很有限。Python的优化集中在解释器自身,也就是说,不管代码写的怎样,Python程序的运行速度根本上取决于解释器如何。
- GIL使得同一时间内只有一个线程运行,导致即使是多核CPU,单个进程无论线程有多少,都只会同时使用一核。
- 用多进程实现并行处理,尽量不要用多线程
- Python多线程可能反倒比单线程要慢(多个线程竞争一个共享资源,不断切换)
- 有的Python解释器(或者是编译器)是没有GIL的,官方的CPython是有的。
- 1999年Greg Stein曾尝试去除Python的GIL,但结果是单线程程序比原来慢了40%,多线程的速度增长并不与核心数呈线性关系。最后该补丁未被采纳。
- Python3.2之后有了新的GIL,老GIL中每个线程每执行一定数量的字节码(100行?),然后释放GIL。新GIL中每个线程默认执行5ms就要释放GIL。