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 04 Python
解析Python中的二进制位运算符
May 13 Python
python实现聊天小程序
Mar 13 Python
python处理数据,存进hive表的方法
Jul 04 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
利用python画出折线图
Jul 26 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Python基础教程之输入输出和运算符
Jul 26 Python
python实现web邮箱扫描的示例(附源码)
Mar 30 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
星际原理概述
2020/03/04 星际争霸
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
简单了解Django模板的使用
2017/12/20 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
使用python爬取B站千万级数据
2018/06/08 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
总裁岗位职责
2013/12/04 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
人口与计划生育责任书
2015/05/09 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
如何写好闭幕词
2019/04/02 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
MySQL数字类型自增的坑
2021/05/07 MySQL
Python入门学习之类的相关知识总结
2021/05/25 Python
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL