一个被痛苦困扰的程序员踏上Python threading中lock的漆黑之旅,最终找回曙光!
Lock类是threading中用于锁定当前线程的锁定类,可以防止多个线程在共享资源的时候不会“乱”
首先我们先举个会乱的例子
比如我们有10个人,依次为1-10号,总共10只羊,按顺序割羊,按理来说,应该是先割先结束
import threading
import time
import random
lock = threading.Lock()
##定义羊
yangs = []
def kill_yang(yang):
#定义割羊的速度
time.sleep(random.randint(1, 10))
yangs.append(yang)
print(yangs)
# 嘎羊
def kill():
#定义10个人,按顺序割羊
for i in range(0, 10):
th = threading.Thread(target=kill_yang, args=(i+1,))
th.start()
if __name__ == '__main__':
kill()
结果因为割羊的效率不一样,结果10号比大部分先割完。
[1]
[1, 10]
[1, 10, 7]
[1, 10, 7, 2]
[1, 10, 7, 2, 6]
[1, 10, 7, 2, 6, 8]
[1, 10, 7, 2, 6, 8, 5]
[1, 10, 7, 2, 6, 8, 5, 9]
[1, 10, 7, 2, 6, 8, 5, 9, 4]
[1, 10, 7, 2, 6, 8, 5, 9, 4, 3]
不会乱的例子
但是如果我们只有一把刀呢,我们通过threading.Lock()创造一个把刀,其他人效率再快,没有刀也要等咯~
import threading
import time
import random
dao = threading.Lock()
##定义羊
yangs = []
## 定义一个dao
def kill_yang(yang):
with dao:
#随机等待几秒割
time.sleep(random.randint(1, 10))
yangs.append(yang)
print(yangs)
return yangs
# 嘎羊
def kill():
for i in range(0, 10):
th = threading.Thread(target=kill_yang, args=(i+1,))
th.start()
if __name__ == '__main__':
kill()
最后只能按顺序割羊了!
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
end
求点赞收藏!关注 抖资源
公众号输入python
获取200本python相关电子书
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: