什么是"全局GIL锁"
全局指的是所有CPU,
锁指的每次是只有一个CPU的线程可以执行IO任务
银行四个窗口(进程),四个队伍的客户在排队办理业务,
python中的"全局GIL锁"的意思是:
一旦有一个窗口在办理客户的业务,其他三个窗口必须停止办理,直到这个窗口办理完业务,其他窗口才有机会给客户办理业务.
boke多个窗口有客户在排队,但是所有窗口后面共享一个客服,客服只能轮流办理业务.
也就是说,python的多线程机制,无论你的计算机是多少核,在python的多线程眼里都是单核CPU
也就是说对于IO密集任务,不存在"跨核的多线程"并行一起处理业务的可能行.
所以我们说,python最佳方式是:
多进程+协程的方式
而不是
多进程+线程的方式
Python不存在并行IO,只有单核并发IO
-----------------------------------------
多进程和多协程提升性能的角度是不一样的.
多进程走多核,响应性能的提升在于:各个core各干各的.
多协程走的是单core(非py语言则也是多core,受限制于各个进程),响应性能的提升在于及时交出"等待权"第三方api(例如网页等)
-----------------------------------------
[1]中也提到:
由于 GIL 的存在,大多数情况下 Python 多线程无法利用多核优势。
但是我们部署的时候还是会使用多进程+多携程的方式,这是为什么呢?
因为CPU密集使用多进程依然是有效的.
根据[2]
一个线程有两种情况下会释放全局解释器锁,一种情况是在该线程进入IO操作之前,会主动释放GIL,另一种情况是解释器不间断运行了1000字节码(Py2)或运行15毫秒(Py3)后,该线程也会放弃GIL。
根据[3]
GIL是全局排它锁,
如果多线程任务是IO密集型,就会直接释放GIL,解除阻塞,提高了性能,
如果多线程任务是CPU密集型,因为一个进程只有一个GIL,多个线程共享这一个GIL,所以一个线程释放了GIL,另一个就会唤醒,而释放GIL的线程就会等待下一次被唤醒,导致效率不会提高,不过可以使用多进程解决。
Reference:
[1]从伪并行的 Python 多线程说起
[2]深入理解Python中的GIL(全局解释器锁)。
[3]高并发(一)通俗易懂解释IO,CPU密集任务及GIL