零壹教育:GIL限制下CPU与IO密集型最佳方案
零壹教育:用 Python 跑多线程做密集计算结果比单线程还慢这个反常现象罪魁祸首就是 GIL全局解释器锁——一个让很多人又爱又恨的设计。GIL 的规则很简单同一时刻只允许一个线程执行 Python 代码。你开了八个线程以为在并行跑实际上是在高速轮换轮流用那把锁。两个线程抢同一把锁切换本身就有开销算下来反而比单线程更慢。八核 CPU 只能跑满一个核确实让人心疼。但 GIL 也不是没好处。它让内存管理省心很多不用担心多个线程同时改数据把程序搞崩溃。C 扩展模块不用自己写复杂的锁单线程代码根本感觉不到它的存在。CPython 选这条路是工程上的取舍不是拍脑袋决定的。没有 GILPython 的 C 扩展生态可能不会这么丰富。那什么时候该用多线程IO 密集型场景——网络请求、文件读写、数据库操作。线程遇到 IO 会主动释放 GIL让别的线程上。这时候多线程才是真正的并发一个线程等数据时其他线程继续跑服务器能同时处理成百上千个连接。CPU 密集型怎么办用multiprocessing开进程每个进程有自己的 GIL真正并行跑。或者用 NumPy 这类底层用 C 实现的库它们执行计算时会释放 GIL。Python 3.4 以后还有个选择——asyncio单线程跑协程用事件循环处理海量并发连接比多线程轻量得多一个线程能管几万个任务。别一听 GIL 就嫌弃。搞懂它才能挑对工具。多线程、多进程、异步 IO——Python 的并发工具箱挺齐全的关键看你会不会在合适的场合用合适的家伙。选对了效率翻倍选错了再好的硬件也白搭。