【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库&…...
知乎上线求职工具,助力毕业生破困局
知乎上线求职利器,直击毕业生痛点2026届全国普通高校毕业生预计达1270万人,再创历史新高。与此同时,AI技术加速行业重构,部分传统岗位需求收缩,大量毕业生陷入“海投”困境,难以精准定位自身。在此背景下&a…...
2026年Java面试最常被问的1000道题目及参考答案
Java学到什么程度可以面试工作? 要达到能够面试Java开发工作的水平,需要掌握以下几个方面的知识和技能: 1. 基础扎实:熟悉Java语法、面向对象编程概念、异常处理、I/O流等基础知识。这是所有Java开发者必备的基础,也…...
Unity渲染流水线中的NDC空间:从齐次裁剪到屏幕坐标的完整转换指南
Unity渲染流水线中的NDC空间:从齐次裁剪到屏幕坐标的完整转换指南 在Unity引擎的渲染流水线中,理解NDC(归一化设备坐标)空间的作用至关重要。这个看似抽象的概念,实际上决定了3D场景如何最终呈现在2D屏幕上。对于想要深…...
Python 3.14 JIT编译延迟高达83ms?这不是Bug,是设计——揭秘AST→LLVM IR→Native Code三级缓存失效链
第一章:Python 3.14 JIT编译器性能调优架构设计图Python 3.14 引入的实验性 JIT 编译器(代号 “Triton”)采用分层编译策略,将热点函数动态划分为解释执行、字节码优化、LLVM IR 生成与本地机器码缓存四个协同层级。其核心设计目标…...
AI写论文超厉害!4款AI论文生成工具,解决毕业论文写作难题!
还在为撰写期刊论文而烦恼吗?面对成堆的文献、复杂的格式要求以及无休止的修改,许多学术人员常常感到效率低下。这并不奇怪!不过,不必太担心,以下将推荐4款实测有效的AI论文写作工具,它们能帮助你在论文文献…...
如何将微信聊天记忆转化为数字珍藏:WeChatMsg的数据主权革命
如何将微信聊天记忆转化为数字珍藏:WeChatMsg的数据主权革命 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...
新手福音:基于预置镜像,在快马平台零配置开启Python Web开发之旅
作为一个刚接触Python Web开发的新手,我最近在InsCode(快马)平台上体验了一把零配置搭建个人博客的过程。不得不说,这种基于预置镜像的开发方式,简直是为我们这些初学者量身定制的福音。下面我就来分享一下这次的学习心得。 为什么选择预置镜…...
comsol matlab联合仿真 也可加入solidworks三软件联合 参数化建模 全自动...
comsol matlab联合仿真 也可加入solidworks三软件联合 参数化建模 全自动建模迭代分析 实现多目标优化 帕累托前沿 代码模型与仿真参数化建模这事儿,玩过CAD和仿真的都懂——改个螺丝孔直径就得重新画图导出,累死个人。不过要是把SolidWorks、COMSOL和M…...
Python大麦网智能抢票脚本:三分钟搭建你的自动购票系统
Python大麦网智能抢票脚本:三分钟搭建你的自动购票系统 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为抢不到心仪的演唱会门票而烦恼吗?每次开…...
3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南
3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League…...
