当你今后在开发一些高并发程序时,很有可能出现线程/进程安全问题
解决方案只有加锁,但是在使用锁时,很有可能出现死锁问题
出现死锁的问题的两种问题的情况
1,对同一把锁调用了多次 acquire导致死锁问题(最low的死锁问题),你应该避免这种写法
2,你有多把锁,一个线程抢一把锁,要完成任务必须同时抢到所有的锁,这将导致死锁
如何避免:
1 能不加锁就不加锁
2 如果一定要加 要保证锁只有一把
from threading import Thread
import time
#第一种死锁
lock = Lock()
lock.acpuire()
lock.acquire()
print('over')
#第二种死锁
#可以看做一个盘子 一双筷子
lock1 = Lock()
lock2 = Lock()
def task1():
lock1.acpuire()
print('%s抢到了盘子”%name)
time,sleep(1)
lock2.acpure()
print("%s 抢到了筷子..."%name)
print("%s 吃饭了..."%name)
lock1.release()
lock2.release()
def task2(name):
lock2.acquire()
print("%抢到了筷子”%name)
lock1.acqire()
print("%s吃饭了...."%name)
lock1.release()
lock2.release()
t1 = Thread(target = task1,args = ("渣渣hui")
t1.start()
t2 = Thread(target = task2,args = ("大导演”)
t2.start()
信息量
可以控制同一时间有多少线程可以并发的访问
不是用来处理线程的安全问题
from threading import Semaphore
s_lock = Semaphore(3)
def task():
s_lock.acquire()
time.sleep(1)
print("run...)
s_lock.release()
for i in range(20):
t = Thread(target = task)
t.start()