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