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写入中英文字符串到文件的方法
May 06 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
Numpy数组的保存与读取方法
Apr 04 Python
Python3实现转换Image图片格式
Jun 21 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
python将unicode和str互相转化的实现
May 11 Python
Python实现查找数据库最接近的数据
Jun 08 Python
Python常用扩展插件使用教程解析
Nov 02 Python
Django 实现图片上传和下载功能
Dec 31 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 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 什么是PEAR?(第二篇)
2009/03/19 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
url地址自动加#号问题说明
2010/08/21 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
Python之Web框架Django项目搭建全过程
2017/05/02 Python
python操作mysql代码总结
2018/06/01 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
给朋友的道歉信
2014/01/09 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
爱国演讲稿500字
2014/05/04 职场文书
年度评优评先方案
2014/06/03 职场文书
2014年关工委工作总结
2014/11/17 职场文书
沈阳故宫导游词
2015/01/31 职场文书
会议通知范文
2015/04/15 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
电影圆明园观后感
2015/06/03 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL