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中动态获取对象的属性和方法的教程
Apr 09 Python
python实现计算倒数的方法
Jul 11 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
Python中的字符串查找操作方法总结
Jun 27 Python
python实现决策树ID3算法的示例代码
May 30 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
php之Memcache学习笔记
2013/06/17 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
vue组件发布到npm简单步骤
2017/11/30 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
公司前台接待岗位职责
2013/12/03 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
2014年医务科工作总结
2014/12/18 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android