python 多线程共享全局变量的优劣


Posted in Python onSeptember 24, 2020

一、多线程共享全局变量

首先我们来回忆下在函数中修改全局变量的情况。

在一个函数中,对全局变量进行修改的时候,到底是否需要使用 global 进行说明,要看是否对全局变量的执行指向进行了修改。

如果修改了执行指向,即让全局变量指向了一个新的地方,那么必须使用 global。

如果仅仅是修改了指向的空间中的数据,此时不是必须要使用 global。

我们来看一个例子,在这个例子中,让一个子线程对全局变量 +1 操作,另一个子线程只打印全局变量,看看数据是否共享。

from threading import Thread
import time

g_num = 100

def work1():
  global g_num
  g_num += 1
  print("----in work1, g_num is %d---" % g_num)

def work2():
  print("----in work2, g_num is %d---" % g_num)

def main():
  print("---线程创建之前g_num is %d---" % g_num)

  t1 = Thread(target=work1)
  t1.start()

  # 延时一会,保证t1线程中的事情做完
  time.sleep(1)

  t2 = Thread(target=work2)
  t2.start()

  time.sleep(1)
  print("---线程创建之后g_num is %d---" % g_num)

if __name__ == "__main__":
  main()

如果子线程2打印出来的结果是100,说明全局变量不共享。

如果子线程2打印出来的数据是101,说明全局变量共享。

运行结果:

---线程创建之前g_num is 100---
----in work1, g_num is 101---
----in work2, g_num is 101---
---线程创建之后g_num is 101---

上面的例子说明,多线程是共享全局变量的。

二、列表当做实参传递到线程中

在上面,我们验证了多线程之间是共享全局变量的。

我们也可以将变量当作实参传递到线程中,来验证多线程中是共享数据的。

from threading import Thread
import time

def work1(nums):
  nums.append(44)
  print("----in work1---", nums)

def work2(nums):

  print("----in work2---", nums)


g_nums = [11, 22, 33]

t1 = Thread(target=work1, args=(g_nums,))
t1.start()
# 延时一会,保证t1线程中的事情做完
time.sleep(1)
t2 = Thread(target=work2, args=(g_nums,))
t2.start()

运行结果:

----in work1--- [11, 22, 33, 44]
----in work2--- [11, 22, 33, 44]

那为什么多个线程之间要共享全局变量,有什么好处么?

因为多任务往往配合使用。

在一个进程内的所有线程共享全局变量,就可以很方便在多个线程间共享数据。

缺点就是,线程是对全局变量随意修改可能造成多线程之间对全局变量的混乱(即线程非安全)。

以上就是python 多线程共享全局变量的优劣的详细内容,更多关于python 多线程共享全局变量的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
wxPython窗口中文乱码解决方法
Oct 11 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
Python正则表达式实现截取成对括号的方法
Jan 06 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
改变 Python 中线程执行顺序的方法
Sep 24 #Python
浅析Python 字符编码与文件处理
Sep 24 #Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 #Python
python判断元素是否存在的实例方法
Sep 24 #Python
python 实现单例模式的5种方法
Sep 23 #Python
python zip()函数的使用示例
Sep 23 #Python
python 判断一组数据是否符合正态分布
Sep 23 #Python
You might like
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python解决八皇后问题示例
2018/04/22 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
小结Python的反射机制
2020/09/28 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
自我评价是什么
2014/01/04 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
先进班集体申报材料
2014/12/26 职场文书
投资入股协议书
2016/03/22 职场文书
python 远程执行命令的详细代码
2022/02/15 Python
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python