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 相关文章推荐
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
python3爬虫怎样构建请求header
Dec 23 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
python实现动态创建类的方法分析
Jun 25 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
编写python代码实现简单抽奖器
Oct 20 Python
python实现一个简单RPC框架的示例
Oct 28 Python
python查询MySQL将数据写入Excel
Oct 29 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 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 分页原理详解
2009/08/21 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php实现rc4加密算法代码
2012/04/25 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
PHP钩子实现方法解析
2019/05/21 PHP
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
2015/06/24 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
详解Python的Django框架中的模版相关知识
2015/07/15 Python
Python 操作MySQL详解及实例
2017/04/30 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
Python之list对应元素求和的方法
2018/06/28 Python
Python 字符串换行的多种方式
2018/09/06 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
老师给学生的表扬信
2014/01/17 职场文书
端午节活动总结报告
2015/02/11 职场文书
培训通知
2015/04/17 职场文书
小学班主任研修日志
2015/11/13 职场文书
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers