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脚本操作文件的小示例分享
Aug 27 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
修改python plot折线图的坐标轴刻度方法
Dec 13 Python
pandas分区间,算频率的实例
Jul 04 Python
使用python socket分发大文件的实现方法
Jul 08 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
如何为Python终端提供持久性历史记录
Sep 03 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python获取百度热搜的完整代码
Apr 07 Python
Python中的嵌套循环详情
Mar 23 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
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
django 按时间范围查询数据库实例代码
2018/02/11 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
.NET笔试题(20个问题)
2016/02/02 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
2013英文求职信模板范文
2013/11/15 职场文书
2015年元旦活动总结
2014/05/09 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
2015年团支部工作总结
2015/04/03 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
python中super()函数的理解与基本使用
2021/08/30 Python