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 相关文章推荐
python中实现迭代器(iterator)的方法示例
Jan 19 Python
基于python神经卷积网络的人脸识别
May 24 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
Python2与Python3的区别实例分析
Apr 11 Python
Python动态语言与鸭子类型详解
Jul 01 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
python实现交并比IOU教程
Apr 16 Python
python如何处理程序无法打开
Jun 16 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
用PHP生成excel文件到指定目录
2015/06/22 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
pycharm远程调试openstack代码
2017/11/21 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
Python csv模块使用方法代码实例
2019/08/29 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
如何理解python对象
2020/06/21 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
档案管理员岗位职责
2015/02/12 职场文书
乱世佳人观后感
2015/06/08 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
MySQL Server层四个日志的实现
2022/03/31 MySQL