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读取csv文件示例(python操作csv)
Mar 11 Python
Python的内存泄漏及gc模块的使用分析
Jul 16 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
Python 字符串池化的前提
Jul 03 Python
Keras实现DenseNet结构操作
Jul 06 Python
实例代码讲解Python 线程池
Aug 24 Python
Python tkinter制作单机五子棋游戏
Sep 14 Python
Python Serial串口基本操作(收发数据)
Nov 06 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
UCenter Home二次开发指南
2009/05/28 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
js 页面输出值
2008/11/30 Javascript
js 居中漂浮广告
2010/03/21 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
javascript数组去掉重复
2011/05/12 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python插入排序算法的实现代码
2013/11/21 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
remote接口和home接口主要作用
2013/05/15 面试题
20年同学聚会感言
2014/02/03 职场文书
教师节标语大全
2014/10/07 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
文明礼仪倡议书
2015/04/28 职场文书
庆七一活动简报
2015/07/20 职场文书
mysql序号rownum行号实现方式
2022/12/24 MySQL