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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
python书籍信息爬虫实例
Mar 19 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
python手写均值滤波
Feb 19 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
python实现文字版扫雷
Apr 24 Python
flask开启多线程的具体方法
Aug 02 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
解决python3安装pandas出错的问题
May 20 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设计模式 Delegation(委托模式)
2011/06/26 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
js 操作符汇总
2014/11/08 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
go和python变量赋值遇到的一个问题
2017/08/31 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Python中正则表达式的用法总结
2019/02/22 Python
学习python可以干什么
2019/02/26 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
《落花生》教学反思
2014/02/25 职场文书
学校师德承诺书
2014/05/23 职场文书
建筑工地宣传标语
2014/06/18 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫