并发编程——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
Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池