一, 全局解释器锁(GIL)
1. 什么是全局解释器锁
在同一个进程中只要有一个线程获取了全局解释器 (CPU) 的使用权限, 那么其他的线程就必须等待该线程的全局解释器 (CPU) 使用权消失后才能使用全局解释器(CPU), 即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用 CPU, 这样的机制称为全局解释器锁(GIL).
同一时刻的某个进程下的某个线程只能被一个 CPU 所处理, 所以在 GIL 锁下的线程只能被并发, 不能被并行.
2. 全局解释器锁的优点
避免了大量的加锁解锁的好处
使数据更加安全, 解决多线程间的数据完整性和状态同步
3. 全局解释器锁的缺点
多核处理器退化成单核处理器, 只能并发不能并行.
二, 同步锁
1. 什么是同步
同一时刻的一个进程下的一个线程只能使用一个 CPU, 要确保这个线程下的程序在一段时间内被 CPU 执, 那么就要用到同步锁.
2. 为什么要用同步锁
因为有可能当一个线程在使用 CPU 时, 该线程下的程序可能会遇到 io 操作, 那么 CPU 就会切到别的线程上去, 这样就有可能会影响到该程序结果的完整性.
3. 怎么使用同步锁
只需要在对公共数据的操作前后加上上锁和释放锁的操作即可.
三, 递归锁和死锁
1. 死锁
指两个或两个以上的线程或进程在执行程序的过程中, 因争夺资源而相互等待的一个现象.
2. 递归锁
在 Python 中为了支持同一个线程中多次请求同一资源, Python 提供了可重入锁. 这个 RLock 内部维护着一个 Lock 和一个 counter 变量, counter 记录了 acquire 的次数, 从而使得资源可以被多次 require. 直到一个线程所有的 acquire 都被 release, 其他的线程才能获得资源.
四, 信号量(semaphore)
1. 什么是信号量
同进程的一样, semaphore 管理一个内置的计数器, 每当调用 acquire()时内置函数 - 1, 每当调用 release()时内置函数 + 1.
计数器不能为 0, 当计数器为 0 时 acquire()将阻塞线程, 直到其他线程调用 release().
来源: http://www.bubuko.com/infodetail-3215900.html