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 连连看连接算法
Nov 22 Python
python统计一个文本中重复行数的方法
Nov 19 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
高效使用Python字典的清单
Apr 04 Python
Pycharm设置界面全黑的方法
May 23 Python
python逆序打印各位数字的方法
Jun 25 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
Django继承自带user表并重写的例子
Nov 18 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
python标准库ElementTree处理xml
May 20 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获取网络上文件
2006/10/09 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
跟老齐学Python之print详解
2014/09/28 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
详解用python写一个抽奖程序
2019/05/10 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
python获取array中指定元素的示例
2019/11/26 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python实现随机加减法生成器
2020/02/24 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
结婚喜宴主持词
2014/03/14 职场文书
股东协议书范本
2014/04/14 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
单位推荐信范文
2015/03/27 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
员工工作心得体会
2019/05/07 职场文书
Python pandas之求和运算和非空值个数统计
2021/08/07 Python