码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-09-07 15:58:12      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:本质   事件   访问   get   size   垃圾   img   str   解释器   

 

一、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

标签:本质   事件   访问   get   size   垃圾   img   str   解释器   

原文地址:https://www.cnblogs.com/linagcheng/p/9604897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!