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 相关文章推荐
Python3写入文件常用方法实例分析
May 22 Python
python实现爬虫下载美女图片
Jul 14 Python
Python编程中time模块的一些关键用法解析
Jan 19 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
PyQt5每天必学之布局管理
Apr 19 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
Django 返回json数据的实现示例
Mar 05 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 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 HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP中的float类型使用说明
2010/07/27 PHP
php读取mysql的简单实例
2014/01/15 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
JS 自动安装exe程序
2008/11/30 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
AI人工智能 Python实现人机对话
2017/11/13 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
pyqt5中动画的使用详解
2020/04/01 Python
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
介绍一下游标
2012/01/10 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
机电一体化毕业生求职信
2013/11/02 职场文书
保险公司早会主持词
2014/03/22 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
导游词之日本富士山
2020/01/06 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python