初学者笔记,非专业,或有出入。
锁的分类:
1.GIL(Global Interpreter Lock)全局解释器锁
2.同步锁
当一个进程中同时启动的几个线程,需要对同一个资源(比如变量)有update需求时,使用同步锁,可以在同一时间保证只有一个进程占用资源,其他线程处于阻塞中。
3.递归锁
使用场景:
线程一:先使用A,过程中需要用到B,使用完B后,才能继续A的剩余工作;
线程二:先使用B,过程中需要用到A,使用完A后,才能继续B的剩余工作。
死锁发生:线程一get到A时,线程二get到B,而他们都需要对方的资源才能进一步释放自身get的资源,就造成了相互等待。
解决办法:为了防止不同线程抢占不同资源,而又相互等待。可以将资源A和资源B上同样的一把锁(每个资源一把锁,只是锁长的一样,这两把锁可以看作是同一串上的两把锁),然后在线程中进行两次lock动作,这样就可以一次性锁住两个资源。因为是同一串上的,所以在acquire其中一个时,连带另一个也被线程占用,但是也需要一个acquire动作,才能真正lock住另外一个资源。
4.Semaphore
当有10个线程,每次最多只想要并行5个线程时,可以使用threading.Semaphore(5),来规定每次最多5个线程并行进行
5.Condition
浅显的理解是,当两个线程相互有条件要求时,比如库存清零时,消费者会等待,知道生产者生产出产品,而当有库存非零时,生产者等待,消费者消费。
6.Event
当线程A需要线程B来触发时,会用到Event。