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 相关文章推荐
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
Flask框架各种常见装饰器示例
Jul 17 Python
简单谈谈python基本数据类型
Sep 26 Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
Python文件操作基础流程解析
Mar 19 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
用python实现名片管理系统
Jun 18 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
pandas中关于apply+lambda的应用
Feb 28 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
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python单例模式实例详解
2017/03/01 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Django stark组件使用及原理详解
2019/08/22 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
自考生自我评价分享
2014/01/18 职场文书
生日寄语大全
2014/04/08 职场文书
python编写函数注意事项总结
2021/03/29 Python