并发编程——GIL全局解释器锁死锁现象与递归锁信号量Event事件线程queue

Posted linagcheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程——GIL全局解释器锁死锁现象与递归锁信号量Event事件线程queue相关的知识,希望对你有一定的参考价值。

 

一、GIL全局解释器锁

1、什么是全局解释器锁

GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程,必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行,但是可以实现并发。

#1 所有数据都是共享的,这其中,代码作为一种数据也是被所有线程共享的(test.py的所有代码以及Cpython解释器的所有代码)#2 所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行,即所有的线程要想运行自己的任务,首先需要解决的是能够访问到解释器的代码。

例如下面多个线程的执行过程:

多个线程先访问到解释器的代码,即拿到执行权限,然后将target的代码交给解释器的代码去执行

解释器的代码是所有线程共享的,所以垃圾回收线程也可能访问到解释器的代码而去执行,这就导致了一个问题:对于同一个数据100,可能线程1执行x=100的同时,而垃圾回收执行的是回收100的操作,解决这种问题没有什么高明的方法,就是加锁处理,如下图的GIL,保证python解释器同一时间只能执行一个任务的代码

技术分享图片

2、为什么要用GIL

因为CPython解释器的垃圾回收机制不是线程安全的

二、GIL与LOCK

(1)GIL是保护解释器级别的锁,使利用CPython解释器时并发使用

(2)LOCK是自定义的锁,用来保证多线程/进程对同一个数据进行修改时的数据安全,使修改数据时串行

 技术分享图片

 

以上是关于并发编程——GIL全局解释器锁死锁现象与递归锁信号量Event事件线程queue的主要内容,如果未能解决你的问题,请参考以下文章

python学习第37天GIL锁死锁现象与递归锁信号量Event时间线程queue

并发编程--一堆锁,GIL,同步异步,Event事件

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

GIL全局解释器锁死锁递归锁信号量Event事件线程Queue

并发编程小结

线程同步锁死锁递归锁信号量GIL