一个被痛苦困扰的程序员踏上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

感谢,学到了

8个月前 评论

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

7个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!