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实用技巧两则
Aug 29 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
详解K-means算法在Python中的实现
Dec 05 Python
python读写csv文件实例代码
Jul 05 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
python绘制封闭多边形教程
Feb 18 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
python绘制高斯曲线
Feb 19 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 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 VS ASP
2006/10/09 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
用Python写一个自动木马程序
2019/09/17 Python
python interpolate插值实例
2020/07/06 Python
Python 日期与时间转换的方法
2020/08/01 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
怎样让char类型的东西转换成int类型
2013/12/09 面试题
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
几道Java和数据库的面试题
2013/05/30 面试题
大专生简历的自我评价
2013/11/26 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技