python 多线程共享全局变量的优劣
作者:小名叫小明 发布时间:2023-11-20 20:55:16
一、多线程共享全局变量
首先我们来回忆下在函数中修改全局变量的情况。
在一个函数中,对全局变量进行修改的时候,到底是否需要使用 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]
那为什么多个线程之间要共享全局变量,有什么好处么?
因为多任务往往配合使用。
在一个进程内的所有线程共享全局变量,就可以很方便在多个线程间共享数据。
缺点就是,线程是对全局变量随意修改可能造成多线程之间对全局变量的混乱(即线程非安全)。
来源:https://www.cnblogs.com/studyming/p/13722293.html


猜你喜欢
- 之前我们曾经分享过:Python获取某一日期是“星期几”的6种方法!实际上,在我们使用Python处
- 一直以来,ACCESS数据库中的申报数据在分公司与总公司之间传递,用EXCEL或DBASE、TXT甚至ACCESS等格式,我总觉得不太理想。
- RegExp就是建立正则的对像。如:Set regEx = New RegExp regE
- 人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果
- 本文通过Python3+PyQt5实现自定义部件–Counters自定 窗口部件。这个窗口是3*3的网格。本文有两个例子如下: /home/
- (1)标准类型操作符(所有的集合类型)成员关系 (in, not in) &nbs
- JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法,而且还指出了存在
- 前言众所周知在Python 中常用的数据类型bool(布尔)类型的实例对象(值)就两个,真和假,分别用True和False表示。在if 条件
- #coding:utf-8from wsgiref.simple_server import make_serverdef RunServe
- 问题描述:被搜索名字为:andy这时搜索andy正常,但是搜索a就搜不到。解决办法,在索引配置文件中的index中添加min_infix_l
- 思路1.将姓名和单号填入excel表格里面2.读取excel表格,将所有姓名存到ExeclName这个list中,单号存到ExeclId3.
- 前两天拉取公司前端代码修改,发现在开发者工具的sources选项里边,居然没有列出来我要调试的js脚本,后来观察了一下,脚本是动态在页面里引
- 本文主要概括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等操作技巧。1.挂起操
- VUE 集成LODOP插件打印Lodop、C-Lodop使用说明及样例http://www.lodop.net/LodopDemo.html
- 前言jsonpath是一个可以在复杂的json数据中根据用户指定的规则找到特定数据的库。本文利用jsonpath对接口进行封装,旨在写一个对
- 创建变量变量是存放数据值的容器。与其他编程语言不同,Python 没有声明变量的命令。首次为其赋值时,才会创建变量。实例x = 10y =
- 代码如下import pandas as pdimport matplotlib.pyplot as pltimport numpy as
- 合理使用装饰器可以简化开发,并且使得代码更加清晰。下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器。一、不带参数的装饰器我们用一
- 所有代码都是网上百度出来的,通过个人实践找到适合自己的。采用的python 库是 pymouse、pykeyboard安装时直接p
- 翻译自https://pytorch.org/docs/stable/torchvision/models.html主要讲解了torchvi