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操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
利用python批量给云主机配置安全组的方法教程
Jun 21 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
详解python的ORM中Pony用法
Feb 09 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
python实现趣味图片字符化
Apr 30 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
Python绘图之柱形图绘制详解
Jul 28 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 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服务器实现多session并发运行
2006/10/09 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
Javascript window对象详解
2014/11/12 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
python中函数默认值使用注意点详解
2016/06/01 Python
Python元字符的用法实例解析
2018/01/17 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
融资租赁计划书
2014/04/29 职场文书
岗位职责说明书模板
2014/07/30 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
Ajax实现三级联动效果
2021/10/05 Javascript