python多线程和线程锁

这里演示的是一个报数的场景,100个人的队列进行报数,如果一起报肯定得不到真实的人数。那么体现在多线程中就是,在“报数”这个过程中,应该上一把锁,去保证每次只能有一个人报数,报完数拿到最新的人数之后,下一个人才能继续报数。下面是具体演示代码:

1、没上锁的:

from threading import Thread
from time import sleep
from random import uniform

counter = 0


def count_off():
    global counter
    new_count = counter + 1
    count_time = uniform(0.1, 1)
    sleep(count_time)
    counter = new_count


def main():
    threads = []
    for _ in range(100):
        t = Thread(target=count_off)
        t.start()
        threads.append(t)
    for t in threads:
        t.join()
    print(counter)


if __name__ == '__main__':
    main()

2、上锁的:

from threading import Thread, Lock
from time import sleep
from random import uniform

counter = 0


def count_off(lock):
    lock.acquire()
    try:
        global counter
        new_count = counter + 1
        count_time = uniform(0.1, 1)
        sleep(count_time)
        counter = new_count
    finally:
        lock.release()


def main():
    lock = Lock()
    threads = []
    for _ in range(100):
        t = Thread(target=count_off, args=(lock,))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()
    print(counter)


if __name__ == '__main__':
    main()

运行结果是,

没上锁的:1

上锁的:100

正常的,全局变量counter被多线程修改的话,并行的多个线程均只拿到了初始值(类比于100个人一起报数1,所以最后结果为1),加了锁之后,就只能一个个的报了,最后的人数也就是真实人数。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏舟飞流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值