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 创建子进程模块subprocess详解
Apr 08 Python
Python打包可执行文件的方法详解
Sep 19 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
python实现分页效果
Oct 25 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
python try 异常处理(史上最全)
Mar 07 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
python和c语言的主要区别总结
Jul 07 Python
Python实现图片识别加翻译功能
Dec 26 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 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 pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
PHP查询快递信息的方法
2015/03/07 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
javascript中Function类型详解
2015/04/28 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Python: glob匹配文件的操作
2020/12/11 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
护理专科毕业生自荐书范文
2014/02/19 职场文书
电教室标语
2014/06/20 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
2014年项目工作总结
2014/11/24 职场文书
推广普通话主题班会
2015/08/17 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技