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的Twisted框架中使用Deferred对象来管理回调函数
May 25 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
Python反射的用法实例分析
Feb 11 Python
python使用selenium实现批量文件下载
Mar 11 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
详解python的xlwings库读写excel操作总结
Feb 26 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 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 CLI实现简单的数据库实时监控调度
2009/07/01 PHP
php str_pad 函数用法简介
2009/07/11 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python实现TF-IDF算法解析
2018/01/02 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
设计师珠宝:Ylang 23
2018/05/11 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
酒店司机岗位职责
2013/12/14 职场文书
女方回门宴答谢词
2014/01/14 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
个人函授自我鉴定
2014/03/25 职场文书
公司捐款倡议书
2014/05/14 职场文书
员工工作自我评价
2014/09/26 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年度培训工作总结
2014/11/27 职场文书
优秀教师工作总结2015
2015/07/22 职场文书