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 13 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python TKinter获取文本框内容的方法
Oct 11 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 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设计模式 php实现命令模式(command)
2015/12/08 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
python中partial()基础用法说明
2018/12/30 Python
Django框架视图函数设计示例
2019/07/29 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
工商企业管理实习自我鉴定
2013/12/04 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
团结演讲稿范文
2014/05/23 职场文书
职务任命书范本
2014/06/05 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS