python 延时_理解Python多线程5:加锁解决问题,但又带来麻烦!

此系列,已经推送的如下,还没看到的读者,可以走一波:

理解Python多线程4:代码稍作改动,bug就来了

理解Python多线程3:多线程抢夺同一个变量

理解Python多线程2:线程轮询得到CPU时间片的演示例子

理解Python多线程1:通过易懂的小例子展开

篇4说道一个Bug,今天就来修复:

d52e31b7b2e948a04ef5333b31b2b6a3.gif

篇5 加上一把锁,避免出现变量修改不同步的问题。

知道问题出现的原因后,要想修复问题,也没那么复杂。

通过python中提供的锁机制,某段代码只能单线程执行时,上锁,其他线程等待,直到释放锁后,其他线程再争锁,执行代码,释放锁,重复以上。

创建一把锁locka:

bfc879f7997b0dbe28d23e66206ac85b.png

import threading
import time


locka = threading.Lock()

通过 locka.acquire() 获得锁,通过locka.release()释放锁,它们之间的这些代码,只能单线程执行。

a = 0
def add1():
global a
try:
locka.acquire() # 获得锁
tmp = a + 1
time.sleep(0.2) # 延时0.2秒,模拟写入所需时间
a = tmp
finally:
locka.release() # 释放锁
print('%s adds a to 1: %d'%(threading.current_thread().getName(),a))

threads = [threading.Thread(name='t%d'%(i,),target=add1) for i in range(10)]
[t.start() for t in threads]

执行结果如下:

t0  adds a to 1: 1
t1 adds a to 1: 2
t2 adds a to 1: 3
t3 adds a to 1: 4
t4 adds a to 1: 5
t5 adds a to 1: 6
t6 adds a to 1: 7
t7 adds a to 1: 8
t8 adds a to 1: 9
t9 adds a to 1: 10

一切正常,其实这已经是单线程顺序执行,就本例子而言,已经失去多线程的价值,并且还带来了因为线程创建开销,浪费时间的副作用。

33fa8591436b66818304d8e8ed5be8ac.gif

程序中只有一把锁,通过 try...finally还能确保不发生死锁。但是,当程序中启用多把锁,还很容易发生死锁。

这么说,多线程的这种使用场合,就不妙了哦。那么,实际使用中,我该怎么办呢,python有没有更牛逼点的技术,提高类似场景的计算速度呢?

且看下篇,Python协程


轻触这里,给我留言

阅读更多:

Python之路200个小例子,在线网页版来了,从此学习更方便!

9e22a237fd59b341c17b6fd70d5b60a6.png

Python小例子,长按关注

真诚奉献,从一而终

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值