python多线程可以使任务得到并发执行,但是有时候在执行多次任务的时候,变量出现“意外”。
import threading,time
n=0
start=time.time()
def b1(num):
global n
n=n+num
n=n-num
def b2(num):
for i in range(1000000):
b1(num)
t1=threading.Thread(target=b2,args=(5,))
t2=threading.Thread(target=b2,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
end=time.time()
print(n)
print(end-start)
执行结果:
18
0.7520430088043213
可见变量n从0变成了18,用时是0.75s,原因是计算机系统计算类似n=n+num是分两步计算的,先计算n+num的值放进内存中,然后再把计算的值赋值给n,正是这个间隙导致了变量出现“意外”。
这时候可以使用threading.Lock来把线程中的变量锁定,使用完再释放!
import threading,time
n=0
lock=threading.Lock()
start=time.time()
def b1(num):
global n
n=n+num
n=n-num
def b2(num):
for i in range(1000000):
lock.acquire()#等待获取或获取修改变量的权限,并霸占它们
b1(num)
lock.release()#释放霸占的变量
t1=threading.Thread(target=b2,args=(5,))
t2=threading.Thread(target=b2,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
end=time.time()
print(n)
print(end-start)
执行结果:
0
3.335190773010254
虽然变量的值正确了,但慢了很多倍,效率大大的打折扣,多线程的优势也没凸显出来。