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实现爬虫统计学校BBS男女比例之数据处理(三)
Dec 31 Python
Python自动生产表情包
Mar 17 Python
Python根据成绩分析系统浅析
Feb 11 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
基于python代码批量处理图片resize
Jun 04 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
用python制作个音乐下载器
Jan 30 Python
Python基础之hashlib模块详解
May 06 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 substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
php实现微信支付之企业付款
2018/05/30 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
python读写ini配置文件方法实例分析
2015/06/30 Python
浅谈django model postgres的json字段编码问题
2018/01/05 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
人民教师的自我评价分享
2014/02/21 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
2015年春节标语口号
2014/12/09 职场文书
2014年路政工作总结
2014/12/10 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
中学社团活动总结
2015/05/07 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers