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使用pil生成缩略图的方法
Mar 26 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
python使用pycharm环境调用opencv库
Feb 11 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
Django使用Profile扩展User模块方式
May 14 Python
浅谈Python中的继承
Jun 19 Python
Python filter过滤器原理及实例应用
Aug 18 Python
python实现按日期归档文件
Jan 30 Python
详细总结Python常见的安全问题
May 21 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
COM in PHP (winows only)
2006/10/09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
jsTree使用记录实例
2016/12/01 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
python二进制文件的转译详解
2019/07/03 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
J2EE是技术还是平台还是框架
2016/08/14 面试题
小区文明倡议书
2014/05/16 职场文书
工作年限证明模板
2014/11/01 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
初中班干部工作总结
2015/08/10 职场文书
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android