一个被痛苦困扰的程序员踏上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 协议》,转载必须注明作者和本文链接
讨论数量: 2

感谢,学到了

1年前 评论

... 你上面的例子是因为 random.randint 可能从 0-10 里面取到了最小的随机数,所以导致了 10 在最前面。你如果不加 random 那个,直接 sleep(yang) 还是会按顺序来的。

1年前 评论