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中的jquery PyQuery库使用小结
May 13 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Django框架模板介绍
Jan 15 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
python实现简单日志记录库glog的使用
Dec 13 Python
python3 实现调用串口功能
Dec 26 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
Python ConfigParser模块的使用示例
Oct 12 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 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 和 COM
2006/10/09 PHP
php实现的短网址算法分享
2014/06/20 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
python nmap实现端口扫描器教程
2020/05/28 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
J2EE面试题集锦(附答案)
2013/08/16 面试题
2014三八妇女节活动总结
2014/03/01 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
个人安全承诺书
2014/05/22 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
2019军训心得体会
2019/06/27 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android