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中使用判断语句和循环的教程
Apr 25 Python
python通过函数属性实现全局变量的方法
May 16 Python
Python文件及目录操作实例详解
Jun 04 Python
Python实现基本线性数据结构
Aug 22 Python
python的unittest测试类代码实例
Dec 07 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
Python filter过滤器原理及实例应用
Aug 18 Python
python 决策树算法的实现
Oct 09 Python
django中cookiecutter的使用教程
Dec 03 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 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在Web开发领域的优势
2006/10/09 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
PHP提交表单失败后如何保留已经填写的信息
2014/06/20 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
详解jQuery事件
2017/01/13 Javascript
Ajax基础知识详解
2017/02/17 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
python实现桌面托盘气泡提示
2019/07/29 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
大学班级文化建设方案
2014/05/06 职场文书
党员个人总结范文
2015/02/14 职场文书