线程部分进一步了解

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

 

                    

                   

                

                

  

posted @ 2018-09-07 20:26  &nbsp  阅读(174)  评论(0编辑  收藏  举报