此系列,已经推送的如下,还没看到的读者,可以走一波:
理解Python多线程4:代码稍作改动,bug就来了
理解Python多线程3:多线程抢夺同一个变量
理解Python多线程2:线程轮询得到CPU时间片的演示例子
理解Python多线程1:通过易懂的小例子展开
篇4说道一个Bug,今天就来修复:
篇5 加上一把锁,避免出现变量修改不同步的问题。
知道问题出现的原因后,要想修复问题,也没那么复杂。
通过python中提供的锁机制,某段代码只能单线程执行时,上锁,其他线程等待,直到释放锁后,其他线程再争锁,执行代码,释放锁,重复以上。
创建一把锁locka
:
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
一切正常,其实这已经是单线程顺序执行,就本例子而言,已经失去多线程的价值,并且还带来了因为线程创建开销,浪费时间的副作用。
程序中只有一把锁,通过 try...finally
还能确保不发生死锁。但是,当程序中启用多把锁,还很容易发生死锁。
这么说,多线程的这种使用场合,就不妙了哦。那么,实际使用中,我该怎么办呢,python有没有更牛逼点的技术,提高类似场景的计算速度呢?
且看下篇,Python协程。
轻触这里,给我留言
阅读更多:
Python之路200个小例子,在线网页版来了,从此学习更方便!
Python小例子,长按关注
真诚奉献,从一而终