多线程例子:
线程锁:
锁是Python提供给我们能够自行操控线程切换的一种手段,使用锁可以让线程的切换变的有序。
一旦线程的切换变的有序后,各个线程之间对数据的访问、修改就变的可控,所以若要保证线程安全,就必须使用锁。
threading模块中提供了5种最常见的锁,下面是按照功能进行划分:
-
同步锁:lock(一次只能放行一个)
-
递归锁:rlock(一次只能放行一个)
-
条件锁:condition(一次可以放行任意个)
-
事件锁:event(一次全部放行)
-
信号量锁:semaphore(一次可以放行特定个)
- 递归锁:
-
互斥锁如果嵌套了多个锁之后,会将自己锁死永远都出不来了。
这个时候可以使用递归锁,它相当于一个字典,记录了锁的门与锁的对应值,当开门的时候会根据对应来开锁。
-
import threading
# run1第二道锁
def run1():
print("grab the first part data")
lock.acquire()
global num
num +=1
lock.release()
return num# run2第三道锁
def run2():
print("grab the second part data")
lock.acquire()
global num2
num2+=1
lock.release()
return num2# run3相当于第一道锁
def run3():
# 获取一把锁
lock.acquire()
res = run1()
print('--------between run1 and run2-----')
res2 = run2()
# 释放一把锁
lock.release()
print(res,res2)# 生成两个变量
num,num2 = 0,0# 生成递归锁实例
lock = threading.RLock()# 循环开启10个线程
for i in range(10):
t = threading.Thread(target=run3)
t.start()# 如过大于1个线程就成立
while threading.active_count() != 1:# 打印当前还有多少个线程
print(threading.active_count())
else:
print('----all threads done---')
print(num,num2)