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 30 Python
Python实现删除Android工程中的冗余字符串
Jan 19 Python
Python的设计模式编程入门指南
Apr 02 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
Python递归函数定义与用法示例
Jun 02 Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 Python
java中的控制结构(if,循环)详解
Jun 26 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
python函数中将变量名转换成字符串实例
May 11 Python
Python程序慢的重要原因
Sep 04 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
python 发送邮件的四种方法汇总
Dec 02 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和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
python挖矿算力测试程序详解
2019/07/03 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
信息部岗位职责
2013/11/12 职场文书
最新党员思想汇报
2014/01/01 职场文书
节水倡议书
2015/01/19 职场文书
2015年化验室工作总结
2015/04/23 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python
JavaScript实现优先级队列
2021/12/06 Javascript