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中的函数用法入门教程
Sep 02 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python在线运行代码助手
Jul 15 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
python tools实现视频的每一帧提取并保存
Mar 20 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
python之生成多层json结构的实现
Feb 27 Python
Anaconda安装pytorch及配置PyCharm 2021环境
Jun 04 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
Protoss兵种介绍
2020/03/14 星际争霸
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
python内存动态分配过程详解
2019/07/15 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
乌鸦喝水教学反思
2014/02/07 职场文书
公司拓展活动方案
2014/02/13 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
活动总结范文
2014/08/30 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
会议主持词通用版
2019/04/02 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
python如何为list实现find方法
2022/05/30 Python
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers