线程部分进一步了解

本文详细解析了Python中GIL全局解释器锁的作用与必要性,介绍了如何避免死锁及使用递归锁,探讨了信号量、Event事件及线程queue在多线程编程中的应用。

一:GIL全局解释器锁:

                   1:什么是GIL全局解释器锁                                   

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

                                在Cpython解释器下,如果想实现并行可以开启多个进程

                   2:为何要有GIL全局解释器锁:

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

                         计算密集型:应该使用多进程,如图1:

                         IO密集型: 应该开启多线程,如图2:

 

二:死锁与递归锁:

                        死锁就是互相拿着对方想要的锁,但是互相又都不释放,结果双方都被锁死的情况,通过RLock递归锁

                  就可以有效的避免死锁现象了。

                   1:死锁现象演示:如图3:

                   2:递归锁RLock演示:如图4:

 

三:信号量(Semaphore):

                        信号量和互斥锁一样都是锁,之前讲的互斥锁是把对共享数据修改的那一部分代码变成串行,牺牲效率,

                  保证数据安全,保证同一时间只有一个运行,而信号量是同一时间可以多个运行。如图5:

 

四:Event事件:

                         Event事件指的是多个线程之间需要协同工作,也就是一个线程的运行需要依赖于另外一个线程为其做好

                  一些准备工作再执行。Event事件的原理就是一个线程运行完毕可以通知其它的线程。如图6:

 

五:线程queue:

                          之前在进程的queue说过,由于进程之间的内存空间是相互隔离的,所以需要一种机制既有能共享的内存

                 空间,又能解决锁的问题。现在虽然在线程中,同一进程下的多个线程是共享该进程内的资源,不像进程那样

                 是相互隔离的,但是还有锁的问题,所以还是建议用线程queue来通信。

                          这个queue可以分为三大类:

                                          ①:queue.Queue()         #先进先出->队列      如图7:

                                          ②:queue.LifoQueue()   #后进先出->堆栈      如图8:

                                          ③:queue.PriorityQueue()       #优先级:优先级用数字表示,数字越小优先级越高   如图9:

 

                    

                   

                

                

  

转载于:https://www.cnblogs.com/duanxiangyang/p/9605319.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值