200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 一句话讲清楚GIL锁

一句话讲清楚GIL锁

时间:2024-03-24 10:32:45

相关推荐

一句话讲清楚GIL锁

什么是"全局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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。