【python】多线程(3)queue队列之不同延时时长的参数调用问题
链接1:【python】多线程(笔记)(1)
链接2:【python】多线程(笔记)(2)Queue队列
0.问题描述
两个线程,但是不同延时时长,导致数据输出频率不同,但是又想基于其中的最大频率实时输出数据(比如线程一与线程二均用来描述某个物体的运动,但是线程一每2秒输出数据,线程二每1秒输出数据,输出数据方式为[线程一数据,线程二数据],希望屏幕每1秒打印出该数据),但是队列中,以后进先出队列为例,数据每取出之后队列就少一个数据,这就需要用global全局变量作为中间值。
1.示例代码
两个线程,func1与func2,
func1的参数从0开始每2秒自增一次并输入到中间队列中,
func2每1秒从中间队列取出最新的参数并打印到屏幕上:如果队列不为空,则打印最新参数;如果为空,则打印历史参数
中间队列设为q
则逻辑如下:
示例代码如下所示:
注意代码逻辑顺序,非常重要!!!
import threading
import time
import queueq=queue.LifoQueue()#后进先出队列,队列长度无限制global qqq
global ppp
ppp=-1#线程二的初始值,为了区别这里给ppp赋值-1
qqq=-2#线程一的初始值
#这两个参数赋值为负仅为了鉴别线程是否会被执行
#由于线程一在下面的threads中优先于线程二执行,屏幕上不会打印出-1与-2#线程一
def func1():#func1每2秒自增一次global qqqq1=0for i in range(5):q1=q1+1qqq=q1q.put(qqq)#最新的qqq值写入q队列中print ("线程一q1: %s, %s" %(qqq,time.ctime()))time.sleep(2)#每2秒向q线程中填入新值#线程二
def func2():#func2每1秒向线程中取值#global qqqglobal pppfor i in range(10):if q.qsize()==0:#如果q线程为空,赋历史值qqqqq=pppprint ("线程二q2: %s, %s" %(qqqqq,time.ctime()))else:#如果q线程不为空,赋新值q2=q.get([i])#func2获取q队列数据,因为后进先出,因此获取的都是最新数据ppp=q2print ("线程二q2: %s, %s" %(q2,time.ctime()))time.sleep(1)#每1秒向q线程中取值#定义线程
threads = []
t1 = threading.Thread(target=func1)#这里谁是t1谁先执行
threads.append(t1)
t2 = threading.Thread(target=func2)#这里谁是t2谁后执行
threads.append(t2)#主程序/主线程
if __name__ == '__main__':for t in threads:#按照顺序执行threads的内容t.setDaemon(True)t.start()t.join()#子线程优先print ("qqq %s" %qqq)#查看qqq的最新值print ("all over %s" %time.ctime())#查看结束时刻print("queue size= %s" %queue.Queue.qsize(q))#查看队列大小
输出结果:
只看q1,每两秒自增并输出一次,正确
只看q2,每一秒输出一次,输出的都是q1的最新值,正确
错误情况一:给队列提前赋值
导致队列不为空,影响后续输出
错误代码:(第11行提前给队列赋值)
import threading
import time
import queueq=queue.LifoQueue()#后进先出队列,队列长度无限制global qqq
global ppp
ppp=-1#线程二的初始值为了区别这里给ppp赋值-1
qqq=-2#先给qqq赋值,然后写入队列中否则func2一开始无法获取数据
q.put(qqq)#提前给队列赋值#线程一
def func1():#func1每2秒自增一次global qqqq1=0for i in range(5):q1=q1+1qqq=q1q.put(qqq)#最新的qqq值写入q队列中print ("线程一q1: %s, %s" %(qqq,time.ctime()))time.sleep(2)#每2秒向q线程中填入新值#线程二
def func2():#func2每1秒向线程中取值#global qqqglobal pppfor i in range(10):if q.qsize()==0:#如果q线程为空,赋历史值qqqqq=pppprint ("线程二q2: %s, %s" %(qqqqq,time.ctime()))else:#如果q线程不为空,赋新值q2=q.get([i])#func2获取q队列数据,因为后进先出,因此获取的都是最新数据ppp=q2print ("线程二q2: %s, %s" %(q2,time.ctime()))time.sleep(1)#每1秒向q线程中取值#定义线程
threads = []
t1 = threading.Thread(target=func1)#, args=[qqq])
threads.append(t1)
t2 = threading.Thread(target=func2)#, args=[qqq])
threads.append(t2)#主程序/主线程
if __name__ == '__main__':for t in threads:#按照顺序执行threads的内容t.setDaemon(True)t.start()t.join()#子线程优先print ("qqq %s" %qqq)#查看qqq的最新值print ("all over %s" %time.ctime())#查看结束时刻print("queue size= %s" %queue.Queue.qsize(q))#查看队列大小
错误结果:
由于队列被提前赋值,导致17:43:16秒时队列不为空,队列中最开始被赋值的-2被取出
错误情况二:线程逻辑顺序反了
正确的情况是func1先自增、将参数写入队列,func2再取数
反过来的话,func2先取数,此时若未提前定义队列,可能会引起错误
错误代码:
import threading
import time
import queueq=queue.LifoQueue()#后进先出队列,队列长度无限制global qqq
global ppp
ppp=-1#线程二的初始值为了区别这里给ppp赋值-1
qqq=-2#先给qqq赋值,然后写入队列中否则func2一开始无法获取数据
#q.put(qqq)#先给qqq赋值,然后写入队列中否则func2一开始无法获取数据#线程一
def func1():#func1每2秒自增一次global qqqq1=0for i in range(5):q1=q1+1qqq=q1q.put(qqq)#最新的qqq值写入q队列中print ("线程一q1: %s, %s" %(qqq,time.ctime()))time.sleep(2)#每2秒向q线程中填入新值#线程二
def func2():#func2每1秒向线程中取值#global qqqglobal pppfor i in range(10):if q.qsize()==0:#如果q线程为空,赋历史值qqqqq=pppprint ("线程二q2: %s, %s" %(qqqqq,time.ctime()))else:#如果q线程不为空,赋新值q2=q.get([i])#func2获取q队列数据,因为后进先出,因此获取的都是最新数据ppp=q2print ("线程二q2: %s, %s" %(q2,time.ctime()))time.sleep(1)#每1秒向q线程中取值#定义线程
threads = []
t1 = threading.Thread(target=func2)#, args=[qqq])
threads.append(t1)
t2 = threading.Thread(target=func1)#, args=[qqq])
threads.append(t2)#主程序/主线程
if __name__ == '__main__':for t in threads:#按照顺序执行threads的内容t.setDaemon(True)t.start()t.join()#子线程优先print ("qqq %s" %qqq)#查看qqq的最新值print ("all over %s" %time.ctime())#查看结束时刻print("queue size= %s" %queue.Queue.qsize(q))#查看队列大小
错误结果:线程二先被启动而且输出错误数据
这里
#定义线程
threads = []
t1 = threading.Thread(target=func2)#, args=[qqq])
threads.append(t1)
t2 = threading.Thread(target=func1)#, args=[qqq])
threads.append(t2)
导致func2先被执行,正确的应该是
#定义线程
threads = []
t1 = threading.Thread(target=func1)#, args=[qqq])
threads.append(t1)
t2 = threading.Thread(target=func2)#, args=[qqq])
threads.append(t2)
相关文章:

【python】多线程(3)queue队列之不同延时时长的参数调用问题
链接1:【python】多线程(笔记)(1) 链接2:【python】多线程(笔记)(2)Queue队列 0.问题描述 两个线程,但是不同延时时长,导致数据输出…...
Java开发常见基础问题
Java开发的多个方面,包括但不限于Java基础知识、多线程并发、JVM、框架使用、数据库、设计模式、网络编程等。 以下是一些常见的问题以及回答的方向: Java 开发技术常见问题(一) Java 基础知识 对象和类的区别是什么࿱…...
大数据组件doc
1.flink Apache Flink Documentation | Apache Flink 2.kafka Apache Kafka 3.hbase Apache HBase ™ Reference Guide 4.zookeeper ZooKeeper: Because Coordinating Distributed Systems is a Zoo 5.spark Overview - Spark 3.5.1 Documentation 6.idea组件(…...

Docker Hub 国内镜像源配置
Docker Hub 国内镜像源配置 Docker Hub 国内镜像源是指在国内境内提供 Docker 镜像服务的镜像源。由于国际网络带宽等问题,国内用户下载 Docker 镜像通常速度较慢。因此,为了解决这个问题,一些国内的公司和组织提供了 Docker 镜像的国内镜像…...
持续总结中!2024年面试必问 20 道 Kafka面试题(一)
一、Kafka 的基础概念有哪些? Kafka 是一个分布式流处理平台,由 LinkedIn 开发,并于 2011 年成为 Apache 软件基金会的一部分。以下是 Kafka 的一些基础概念: Broker: Kafka 集群由多个 Broker 组成,每个 Broker 存储…...

Linux共享内存创建和删除
最近项目中使用到了共享内存记录下 创建共享内存: 删除共享内存: 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <u…...
微信小程序如何自定义tabbar
微信小程序自定义底部tabbar是一个提升用户体验和增加小程序个性化的重要功能。以下是自定义底部tabbar的步骤,以供参考: 一、自定义tabbar的重要性 微信小程序默认的底部导航栏(tabbar)样式和布局是固定的,开发者无…...

【并发程序设计】15.信号灯(信号量)
15.信号灯(信号量) Linux中的信号灯即信号量是一种用于进程间同步或互斥的机制,它主要用于控制对共享资源的访问。 在Linux系统中,信号灯作为一种进程间通信(IPC)的方式,与其他如管道、FIFO或共享内存等IPC方式不同&…...

【操作与配置】VS2017与MFC环境配置
【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境(IDE),适用于软件开发人员和团队。使用此应用程序,您可以构建和调试现代Web应用程序,并利用扩展帮助探索几乎任何编程语言。…...

遥感影像信息提取
刘老师(副教授),来自双一流重点高校,长期从事GIS/RS/3S技术及其生态环境领域中的应用等方面的研究和教学工作,并参与GIS的二次开发,发表多篇sci论文,具有资深的技术底蕴和专业背景。 专题一&am…...
LRU算法
文章目录 LRU算法LRU 如何实现LinkedHashMap来实现的LRU算法的缓存HashMap实现LRU算法的缓存 LRU算法 LRU(Least Recently Used)算法可以使用哈希表和双向链表来实现。哈希表用于快速查找数据,双向链表用于记录数据的访问顺序。以下是LRU算法…...

JVM运行时数据区 - 程序计数器
运行时数据区 Java虚拟机在执行Java程序的过程中,会把它管理的内存划分成若干个不同的区域,这些区域有各自的用途、创建及销毁时间,有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和结束而建立和销毁࿰…...

1.JAVA小项目(零钱通)
一、说明 博客内容:B站韩顺平老师的视频,以及代码的整理。此项目分为两个版本: 面向过程思路实现面向对象思路实现 韩老师视频地址:【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh4…...

Redis这一篇就够了
一.概述 Redis是什么? Redis是远程服务字典服务,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,Key-Value数据库,并提供多种语言的API。 redis会周期性把更新的数据写入磁盘或把…...

Java web应用性能分析之【jvisualvm远程连接云服务器】
Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 前面整理了java进程问题分析和分析工具,现在可以详细看看jvisualvm的使用,一般java进程都是部署云服务器,或者托管IDC机…...

springboot发送短信验证码,结合redis 实现限制,验证码有效期2分钟,有效期内禁止再次发送,一天内发送超3次限制
springboot结合redis发送短信验证码,实现限制发送操作 前言(可忽略)实现思路正题效果图示例手机号不符合规则校验图成功发送验证码示例图redis中缓存随机数字验证码,2分钟后失效删除redis缓存图验证码有效期内 返回禁止重复发送图验证码24小时内发送达到3次…...
【Python】使用 Pandas 统计每行数据中的空值
缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 🎵 邓紫棋《光年之外》 在数据分析…...
1pannel部署onenav导航容器编排模板
onenav导航 1pannel部署onenav导航容器编排模板 networks:1panel-network:external: true services:onenav:container_name: onenavimage: helloz/onenav:latestlabels:createdBy: Appsnetworks:- 1panel-networkports:- 127.0.0.1:{port}:80environment:- TZAsia/Shanghaivol…...

linux--实时性优化
linux--实时性优化 1 介绍2 实时性需求3 代表性实时系统4 嵌入式系统嵌入式软件系统结构处理器时钟节拍多任务机制任务调度方式任务调度算法时间片调度算法优先级调度算法基于优先级的时间片调度算法 5 cyclictest 测试工具命令说明命令分析参数含义 6 linux 实时性改进某版本上…...

React-基础样式控制
组件基础样式方案 React组件基础的样式控制有两种方式 1、行内样式(不推荐) 属性名是多个单词的需要使用驼峰写法 也可以把样式都提取到一个变量里,再赋值到style里 2、class类名控制 classnames优化类名控制 classnames是一个简单的JS库&…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...