Python 多线程-共享全局变量问题

2023-10-30

多线程-共享全局变量问题

多线程可能遇到的问题

假设有两个线程t1和t2,都要对一个变量g_num进行运算(+1),两个线程t1和t2分别对g_num各加10次,g_num的最终结果?

import threading
import time

g_num = 0


def work1(num):
    global g_num
    for i in range(num):
        g_num += 1
    print('---in work1,g_num in %d---' % g_num)


def work2(num):
    global g_num
    for i in range(num):
        g_num += 1
    print('---in work2,g_num in %d---' % g_num)


print('---线程创建之前g_num: %d' % g_num)

t1 = threading.Thread(target=work1, args=(10,))
t2 = threading.Thread(target=work2, args=(10,))
t1.start()
t2.start()

while len(threading.enumerate()) != 1:
    time.sleep(1)

print('2个线程对同一个变量操作之后的最终结果:%d' % g_num)




---线程创建之前g_num: 0
---in work1,g_num in 10---
---in work2,g_num in 20---
2个线程对同一个变量操作之后的最终结果:20

情况1:

在num = 0时,t1取得num=0,此时系统把t1调度为’sleeping’的状态,t2转换为’running’的状态,t2也获得num=0,然后,t2对得到的值进行加1,并赋给num,num=1。然后,系统又将t2调度为’sleeping’的状态,把t1转换为’running’.线程t1又把它之前得到的0加1后赋值给num。这种情况,明明两个线程都完成了一次+1的工作,但结果还是num=1。

情况2:

如果我们将两个线程的参数调整为1000000,多次运行,结果不同。

说明如果多线程如果同时对一个全局变量操作,会出现一个资源竞争的问题,从而使数据结果不准确,导致线程安全问题。

同步

同步,就是协同步调。按照预定的先后次序进行运行,好比交流,一个说完,另一个人再说。

进程和线程同步,可以理解为进程或者线程A和B一块配合,a执行一定程度时,需要依赖B的某个结果,于是停下来,让B运行,B开始运行,再将结果给A,A再继续操作,如此往复,直至程序结束。

计算错误的解决

通过线程同步进行解决

思路:

  • 系统调度t1,获取num=0,此时上一把锁,既不允许其他操作num

  • 对num的值加1

  • 解锁,此时num的值为1,其他的线程就可以使用num了,此时num = 1

  • 同理,其他线程在对num修改时,也要先上锁,处理完后再解锁。在上锁的过程中,不允许其他线程访问,就保证了数据的正确性。

互斥锁

当多个线程几乎同时修改某个共享数据时,需要同步控制

线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制就是引入互斥锁

互斥锁为我们的资源引入一个状态:锁定/非锁定

某个线程要更改共享数据时,先将其锁定,此时,资源的状态未锁定,其他线程不能对其更改,知道该线程释放资源,资源状态变为’非锁定’状态,其他线程才能再次锁定该资源。

互斥锁,保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

在threading模块里面,定义了Lock()类,可以方便的处理和锁定。

mutex = threading.Lock()   #创建锁
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 多线程-共享全局变量问题 的相关文章

  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 如何使用 Selenium 和 ChromeDriver 解决 TypeError: 'module' object is not callable 错误 [重复]

    这个问题在这里已经有答案了 代码试验 from selenium import webdriver from selenium webdriver chrome options import Options as Chromeoptions
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • C++ 多线程编程(一)- C++11中的线程类

    C 多线程编程 一 C 11中的线程类 1 C 11 多线程编程库 2 线程的创建 2 1 初始化构造函数 2 2 移动构造函数 3 线程的基本操作 3 1 join 阻塞 等待线程结束 3 2 detach 分离线程 1 C 11 多线程
  • 腾讯云时序数据库 CTSDB 开放公测

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 李晓慧 近日 腾讯云推出云上时序数据库CTSDB Cloud Time Series Database CTSDB 是一款分布式 可扩展 高可靠的时序数据库 适用于有海量时序数据的
  • 数组的常用方法总结

    获取指定数组的长度 arr length console log a b c length 3 通常情况下 如果想判断一个数组是否为空 可以通过数组的长度是否为零来判断 数组和字符串的相关转换 2 1 数组转换为字符串 console lo
  • HW SR505红外传感器模块 一直输出高电平

    重点 1 505检测的是物体移动 不是前面是否有人 如果一个人一动不动也是不会检测出来的 2 505的正脚必须接5v 如果接3 3v则会不灵敏 505输出脚高电平总是3 3v 如果out引脚一直输出高电平试一下接 5v 3 505输出一次高
  • 主业外的第二副业选什么比较好,适合普通人的坚持之路

    说到副业 可能大部分人觉得不知道应该做什么 只是因为在物质日益高涨的今天 单单靠上班的一份工资已经不足以实现自己的一些人生规划了 上班永远是别人给你的职位 随时可以让你失去它 真正的经济自由是靠自己 所以需要在工作之余发展一份自己的副业 来
  • linux系统 InfluxDB安装及配置,修改数据路径,傻瓜教程

    linux系统磁盘挂载教程 linux服务器磁盘挂载 新手手把手教学 傻瓜式教程 风电猿的博客 CSDN博客 START 1 安装包下载 提供1 8 0版本的Influxdb安装包 百度网盘 请输入提取码 qlyx 2 安装指令 yum l
  • 关于maven仓库中的_remote.repositories

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题描述 既然有这个jar包为什么还会报错呢 无意间通过dependency tree命令查看依赖 发现 这说明 core common jar包依赖paas thirdp
  • Node.js-Gulp的使用

    概述 Gulp 是基于 Node 平台开发的前端构建工具 主要用来设置程序自动处理静态资源的工作 通过 Gulp 能自动化地完成 html css javascript less sass image 等文件的测试 检查 合并 压缩 格式化
  • 单个按键控制数码管显示数字(2)

    一 主要功能 单个按键控制数码管显示数字 二 代码实现 代码如下 include
  • Unity3D实现简单的血条功能

    在游戏中血条是一个很常见的东西 它可以直观的显示血量 在很多地方都有运用 尤其是小兵或者怪物身上 那么该怎样去制作一个简单的血条呢 其实很简单 血条就是一个UI而已 用一张长条形的图片即可实现 具体操作如下 1 先创建一个3D的物体命名为P
  • web项目----实现简单的增删查改

    本人稀土掘金地址 coding Rayce 的个人主页 动态 掘金 juejin cn 首先了解javaEE的三层架构 由图中我们可以看出 javaEE的三层架构严格的规定了项目中的每个模块 每个层需要完成的事情 这样会使项目的变得非常简洁
  • gtest使用入门(6)-win下使用vscode和cmake构建

    文章目录 概述 一 环境准备 二 源码准备 三 准备googletest源码和测试代码 四 构建并编译源码和测试代码 五 执行测试 六 总结 七 源码获取 概述 最近尝试在windows下使用googletest 并使用CMake进行构建
  • 计算机网络习题(数字数据编码为数字信号)

    计算机网络习题 数字数据编码为数字信号 题目描述 画出非归零编码 曼切斯特编码 差分曼切斯特编码 知识点分析 非归零码 用高 低电压分别来代表 1 0 二进制 相反也可以 曼彻斯特编码 将一个位 位是指一个比特 即上图中两个虚线之间的范围称
  • GeoGebra

    文章目录 一 GeoGebra简介 1 GeoGebra在线图形计算器 2 GeoGebra应用 3 在线资源平台 二 官方网站 1 GeoGebra官网 2 GeoGebra项目源码 3 GeoGebra官网教程 3 1 Learn Ge
  • 05 集成测试:如何进行微服务的集成测试?

    上一课时 我讲解了微服务架构下的单元测试 它是一种白盒测试技术 目的是验证软件代码中的每个单元 方法或类等 是否符合预期 本节课我来讲解微服务架构下的集成测试 集成测试的概念 说到集成测试 相信每个测试工程师并不陌生 它不是一个崭新的概念
  • wps文档格式转换

    网上关于word pdf等相关文档格式转换代码较多 也使用了许多五花八门的三方库来实现 效果也参差不齐 虽然有unoconv服务可以统一 但是效果也不是很满意 国产wps软件的效果是不用说的 但是一直都是支持windows系统 不过现在也有
  • 批量生成固定格式的图片,写上不同的文字

    批量生成下面这种标签 图片 红色圈起的位置和二维码要根据excel的数据动态变化 二维码扫出来是订单编号 思路 1 xlrd库读取excel数据 2 用MyQR库生成订单号的二维码 3 pillow库生成适当大小的空白底图 先是把二维码图片
  • H5 DOM 全屏 api requestFullscreen

    文章转载自 http javascript ruanyifeng com htmlapi fullscreen html toc7 js 设置 退出和判断全屏的方法 设置全屏 退出全屏 全屏属性 全屏事件 全屏状态的CSS 设置全屏 req
  • 操作系统基础-多线程处理浅析

    对于一个大型的复杂项目 或者多人协作的项目 如何处理同时运行的线程 如何在线程之间传递消息 处理同步是首要问题 经历过C 技术面的同学应该深有体会 在面试中 多线程 观察者模式 数据总线 事件总线都是经常被问到的重灾区 最近在工作中遇到的此
  • Python 多线程-共享全局变量问题

    多线程 共享全局变量问题 多线程可能遇到的问题 假设有两个线程t1和t2 都要对一个变量g num进行运算 1 两个线程t1和t2分别对g num各加10次 g num的最终结果 import threading import time g