死锁问题
对同一把锁多次acquire将导致死锁,可以给acquire加上超时(timeout)来保证线程不被卡死。
from threading import Lock
l=Lock()
l.acquire()
l.acquire(timeout=3)
出现死锁的另一种情况:
一个共享资源,要访问必须同时具备多把锁,但是这些锁被不同的进程或者线程所持有,就会导致相互等待对方释放,从而程序就卡死了。
比如吃饭要碗和筷子两把锁,A抢了筷子,B抢了碗。
解决方案:
- 抢锁一定要按照相同的顺序去抢
- 给抢锁加上超时,如果超时则放弃执行
递归锁
与普通锁的区别
多线程之间都有互斥的效果
不同在于 同一个线程可以对这个锁 执行多次acquire
同一个线程必须保证 加锁的次数和解锁的次数相同 其它线程才能够抢到这把锁
信号量
可以限制同时并发执行公共代码的线程数量
如果限制数量为1 则与普通互斥锁没有区别
from threading import Semaphore,currentThread,Thread
import time
s = Semaphore(5)
def task():
s.acquire()
time.sleep(1)
print(currentThread().name)
s.release()
for i in range(10):
Thread(target=task).start()
注意:信号量不是用来解决安全问题的 而是用于限制最大的并发量