1. GIL概念 (cpython历史遗留问题)
概念? 对Python多线程的影响? 编写一个多线程抓取网页的程序? 阐述多线程抓取程序是否比单线程性能有提升, 并解释原因。
-
GIL:全局解释器锁, 每个线程在执行的过程都需要先获取GIL, 保证同一时刻只有一个线程可以执行代码。
-
线程释放GIL锁的情况:在IO操作等可能会引起阻塞的system call之前, 可以暂时释放GIL, 但在执行完毕后, 必须重新获取GIL. Python3.x使用计时器 (执行时间到达阈值后, 当前线程释放GIL)
-
Python使用多进程是可以利用多核的CPU资源的。
-
多线程爬取比单线程性能有提升, 因为遇到 IO阻塞 会自动释放GIL锁。
-
GIL适合在: 计算密集型程序:多进程-能够发挥多核的威力、IO密集型程序:多线程
2. GIL
2.1 2个线程
假多线程, 只有一个线程在执行, 因为GIL存在,发挥不出多核的优势。
2.2 2个进程
真并发
3. 解决GIL版本
-
换Python解释器
-
调C代码执行程序