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二叉树遍历的实现方法
Nov 21 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
python 发送json数据操作实例分析
Oct 15 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
如何在Windows中安装多个python解释器
Jun 16 Python
python入门教程之基本算术运算符
Nov 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
ThinkPHP验证码使用简明教程
2014/03/05 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
Python中的Numpy入门教程
2014/04/26 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
python写入文件自动换行问题的方法
2019/07/05 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
python GUI模拟实现计算器
2020/06/22 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
大学生的创业计划书就该这么写
2014/01/30 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
指导教师推荐意见
2015/06/05 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
初中团支书竞选稿
2015/11/21 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python