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 相关文章推荐
深入讲解Java编程中类的生命周期
Feb 05 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
python检测IP地址变化并触发事件
Dec 26 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
python实现爬取百度图片的方法示例
Jul 06 Python
python 实现单通道转3通道
Dec 03 Python
python GUI模拟实现计算器
Jun 22 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
Python 流媒体播放器的实现(基于VLC)
Apr 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
PHP多进程编程总结(推荐)
2016/07/18 PHP
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
Python中的列表知识点汇总
2015/04/14 Python
python中执行shell的两种方法总结
2017/01/10 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
python 实现汉诺塔游戏
2020/11/28 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
家庭户外服装:Hawkshead
2017/11/02 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
汽车维修专业自荐书
2014/05/26 职场文书
行政求职信
2014/07/04 职场文书
行政主管岗位职责
2015/02/03 职场文书
安全教育主题班会教案
2015/08/12 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS