递归锁:
'''
递归锁:
需求:有多道门,同时只允许一个线程进门
如果用之前的锁,进来的时候进来了,出去的时候找不到对应的锁
下面的程序中,锁的形象表示: { run3 { run1 } { run2 } }
说明:这里有三把锁,如果用的是普通锁,进到run1里面就出不来了。因为找不到哪一把钥匙
所以这里要用递归锁。原理是把钥匙存成字典,每次要开门就挨把挨把的试
'''
import threading
import time
def run1():
print("run1----")
lock.acquire()
global num
num += 1
lock.release()
return num
def run2():
print("====run2")
lock.acquire()
global num2
num2 += 1
lock.release()
return num2
def run3():
lock.acquire()
res = run1()
print("---------run3")
res2 = run2()
lock.release()
print(res, res2)
if __name__ == '__main__':
num, num2 = 0, 0
lock = threading.RLock() # 如果不用递归锁,会进入死循环
for i in range(10):
t = threading.Thread(target=run3)
t.start()
while threading.active_count() != 1:
print(threading.active_count())
else:
print("-------all threads done-------")
print(num, num2)
信号量
'''
信号量:Semaphore
锁同时只允许一个线程更改数据
而Semaphore是同时允许一定数量的线程更改数据
信号量与锁的区别是信号量同时有多把锁
5个线程每完成一个就放进去一个
'''
import threading
import time
def run(n):
semaphore.acquire()
time.sleep(2)
print("run the thread:{0}".format(n))
semaphore.release()
if __name__ == '__main__':
semaphore = threading.BoundedSemaphore(5) #最多允许5个线程同时运行
for i in range(20):
t = threading.Thread(target=run, args=(i,))
t.start()
while threading.active_count() != 1:
pass
else:
print("all threads done")