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


Posted in Python onJuly 16, 2019

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脚本实现集群检测和管理功能
Mar 06 Python
Python利用递归实现文件的复制方法
Oct 27 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
Jul 06 Python
解析python的局部变量和全局变量
Aug 15 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
浅析Python迭代器的高级用法
Jul 16 Python
pytorch 移动端部署之helloworld的使用
Oct 30 Python
Django框架请求生命周期实现原理
Nov 13 Python
python简单验证码识别的实现过程
Jun 20 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 Python
Python 进程之间共享数据(全局变量)的方法
Jul 16 #Python
python实现键盘输入的实操方法
Jul 16 #Python
Django的models中on_delete参数详解
Jul 16 #Python
Python3远程监控程序的实现方法
Jul 15 #Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 #Python
Python 获取windows桌面路径的5种方法小结
Jul 15 #Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 #Python
You might like
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php数组合并的二种方法
2014/03/21 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
javascript每日必学之循环
2016/02/19 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
centos下更新Python版本的步骤
2013/02/12 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Django REST framework内置路由用法
2019/07/26 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
导游词之无锡古运河
2019/11/14 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers
Python中tqdm的使用和例子
2022/09/23 Python