python-GIL、死锁递归锁及线程补充
2018-09-07 19:20
453 查看
一、GIL介绍
GIL全称 Global Interpreter Lock ,中文解释为全局解释器锁。它并不是Python的特性,而是在实现python的主流Cpython解释器时所引入的一个概念,GIL本质上就是一把互斥锁,将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,从而保证数据的安全性。
注:每次执行python程序,都会产生一个独立的进程,进程里除了能看到的若干线程,还有看不见的解释器开启的垃圾回收等解释器级别的线程。
#1 所有数据都是共享的,这其中,代码作为一种数据也是被所有线程共享的(test.py的所有代码以及Cpython解释器的所有代码) 例如:test.py定义一个函数work(代码内容如下图),在进程内所有线程都能访问到work的代码,于是我们可以开启四个线程然后target都指向该代码,能访问到意味着就是可以执行。 #2 所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行,即所有的线程要想运行自己的任务,首先需要解决的是能够访问到解释器的代码。
多个线程先访问到解释器的代码,去拿去执行权限,然后将自己target的代码拿给解释器去执行,解释器的代码是对所有线程都共享的,这个时候就存在一个问题,垃圾回收线程也可以去访问解释器代码,对于同一个数据,可能线程1去修改它的数据的同时 垃圾回收对他执行的是回收操作,这个时候就会导致很多无法预料的bug。GIL加锁处理,就是保证解释器同一时间内只能执行一个任务的代码。这就导致了同一个进程下的线程无法实现并行,不能很好的利用cpu的多核机制,但是还是可以实现并发的。(如果想实现并行只能开启多个进程)
q=queue.PriorityQueue(3) #优先级,优先级用数字表示,数字越小优先级越高 q.put((10,'a')) q.put((-1,'b')) q.put((100,'c')) print(q.get())#(-1, 'b') print(q.get())#(10, 'a') print(q.get())#(100, 'c')PriorityQueue
相关文章推荐
- Python系列之死锁现象和递归锁
- python并发编程之多线程2------------死锁与递归锁,信号量等
- python 线程,GIL 和 ctypes
- 守护进线程,互斥锁,信号量,队列,死锁递归锁等
- python 线程,GIL 和 ctypes(转)
- python GIL锁(python的那些原子性操作)保障线程安全?
- Python 中的线程安全(threadsafe) 与 GIL
- python生产者与消费者模式:队列实现线程通信、ThreadLocal、GIL
- Python进程与线程及GIL(全局解释器锁)
- Python--同步锁(互斥锁)、死锁(状态)、递归锁、信号量、Event对象
- python 线程,GIL 和 ctypes
- Python3之多线程GIL、同步锁、信号量、死锁与递归锁、线程Queue、Event、定时器
- python线程、锁、死锁以及生产者消费者模式
- python 线程,GIL 和 ctypes
- python 线程,GIL 和 ctypes
- [转] GIL 与 Python 线程的纠葛
- python线程和GIL
- Python 单线程死锁(自己等自己),Rlock解决
- python 线程,GIL 和 ctypes
- python 线程,GIL 和 ctypes(转)