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 相关文章推荐
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
Python多继承原理与用法示例
Aug 23 Python
python使用response.read()接收json数据的实例
Dec 19 Python
python语言基本语句用法总结
Jun 11 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
Python reques接口测试框架实现代码
Jul 28 Python
python 命令行传参方法总结
May 25 Python
学会Python数据可视化必须尝试这7个库
Jun 16 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
vue项目打包上传github并制作预览链接(pages)
2019/04/19 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
python继承和抽象类的实现方法
2015/01/14 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python脚本调试工具安装过程
2021/01/11 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
会议活动邀请函
2014/01/27 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
2014财务年终工作总结
2014/12/08 职场文书
亮剑观后感500字
2015/06/05 职场文书
行政处罚事先告知书
2015/07/01 职场文书