python多线程共享变量的使用和效率方法

yipeiwu_com5年前Python基础

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

虽然变量的值正确了,但慢了很多倍,效率大大的打折扣,多线程的优势也没凸显出来。

所以尽量使用局部变量来代替全局变量在线程中使用,这样可以避免效率的问题。

以上这篇python多线程共享变量的使用和效率方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python获取文件路径、文件名、后缀名的实例

实例如下所示: #########start 获取文件路径、文件名、后缀名############ def jwkj_get_filePath_fileName_fileExt(fi...

PyCharm更改字体和界面样式的方法步骤

PyCharm更改字体和界面样式的方法步骤

更改主题 File → Settings → Appearance & Behavior → Appearance → Theme 结果: 更改字体大小 File → Sett...

代码分析Python地图坐标转换

最近做项目正好需要坐标的转换 各地图API坐标系统比较与转换; WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地...

python查找指定具有相同内容文件的方法

本文实例讲述了python查找指定具有相同内容文件的方法。分享给大家供大家参考。具体如下: python代码用于查找指定具有相同内容的文件,可以同时指定多个目录 调用方式:python...

使用Python对SQLite数据库操作

SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在IOS和Android的APP中都可以集成。...