Lock机制通常会使用於,当有多个线程要使用同一个代码资源,且对同一个全域(共享)变数进行修改的时候。
例如当有多个线程要使用同一段程序码资源时,若不想要在使用期间被其他线程拿来同时使用,此时就可以用 锁(Lock) 的机制来确保资源一次只给一个线程运行。
假如今天有一间厕所(function)和一把钥匙(threading.Lock()
),有很多的人(threads)都在排队要大号,先到的人(thread)就可以获得厕所门的钥匙(lock),并且在上厕所的时候会把门锁起来(lock.acquire()
),此时正在排队的其他人就只能在门外等待,直到正在大号的人把门打开将钥匙交出来(lock.release()
),这样下一个人就能拿到这钥匙进入厕所,并把门锁起来以防止他人进入,以此类推~
创建一个lock对象: lock = threading.Lock()
获取使用lock: lock.acquire()
解除释放lock: lock.release()
import threading
import time
lock = threading.Lock() # 厕所门的钥匙(lock)
toilet = [] # 放屎的马桶(list)
# 厕所(function)
def WC():
lock.acquire() # 使用钥匙将厕所门上锁
toilet.append(f"{threading.current_thread().name}: 拉了第1坨屎") # 将当前的人(线程)所拉的第一屎放进马桶(list)中
time.sleep(0.1)
toilet.append(f"{threading.current_thread().name}: 拉了第2坨屎") # 将当前的人(线程)所拉的第二屎放进马桶(list)中
lock.release() # 将厕所门解锁, 并把钥匙放在旁边等下一个人来拿
# 产生3位排队大号的人
for i in range(3):
wc_thread = threading.Thread(target=WC)
wc_thread.start() # 第 i 个人开始进厕所大号
time.sleep(1) # 等待一秒确保三个人都上完厕所, 且马桶内都有他们排放的屎了
print(toilet) # 将马桶内的屎打印出来看排序
['Thread-1: 拉了第1坨屎', 'Thread-1: 拉了第2坨屎', 'Thread-2: 拉了第1坨屎', 'Thread-2: 拉了第2坨屎', 'Thread-3: 拉了第1坨屎', 'Thread-3: 拉了第2坨屎']
['Thread-1: 拉了第1坨屎', 'Thread-2: 拉了第1坨屎', 'Thread-3: 拉了第1坨屎', 'Thread-1: 拉了第2坨屎', 'Thread-3: 拉了第2坨屎', 'Thread-2: 拉了第2坨屎']
由此可知,有使用Lock的马桶(list)结果会是:
先等第一个人(Thread-1)拉完两坨屎後,第二位(Thread-2)和第三位(Thread-3)才会接续继续。
反之,不使用Lock的马桶(list)结果会是:
第一个人(Thread-1)才刚拉完第一坨屎,都还没拉完第二坨,第二位(Thread-2)和第三位(Thread-3)就一起进来各拉了第一坨屎,後续也一起拉了第二坨,等於现在这间厕所内同时有三个人在拉屎。
当有多个执行绪同时执行lock.acquire()
时,只有一个执行绪能成功获取到锁,并且继续执行程序码,其他的执行绪就只能等待直到锁被释放并获得为止。
<<: JS30 Day 25:Event Capture, Propagation, Bubbling and Once学习笔记
>>: Fix Amazon Register Kindle Problem by Kindle Experts @ 1855-935-5060
Shift+Ctrl+R 分段 可缩 Shift+Ctrl+C 多行注解 Shift+Ctrl+M ...
【前言】 这个 IT 铁人的比赛,一开始是 Sen 问我要不要比,我本来是没有多大兴趣的,因为不会...
题干懒人包 基本上跟27题很像,输入是一个已经排序好的数组,最後输出非重复数值的数量,然後以下几点要...
在推动团队开发系统的改善过程中,曾经遇到一个难题: 要如何将合作的流畅度、资讯的透明度以及团队成员的...
Youtube 频道:https://www.youtube.com/c/kaochenlong ...