Python-消息队列模块queue使用指南

queue 模块是 Python 标准库中的一个重要模块,主要用于提供线程安全的队列类,适用于多线程编程中不同线程之间的数据交换。它提供了 3 种类型的队列:

  1. queue.Queue:FIFO(先进先出)队列
  2. queue.LifoQueue:LIFO(后进先出)队列
  3. queue.PriorityQueue:优先级队列

每种队列都具有线程安全特性,能够在多线程环境中安全地使用。

1. 导入 queue 模块

queue 是 Python 内置模块,无需安装,可以直接导入:

import queue

2. queue.Queue(FIFO队列)

queue.Queue 是最常用的队列类型,它实现了先进先出(FIFO)的队列行为。常用于任务队列、数据流传递等场景。

2.1 基本操作
import queue# 创建一个队列,指定最大队列大小(这里设置为3)
q = queue.Queue(maxsize=3)# 向队列中添加元素
q.put(1)
q.put(2)
q.put(3)# 获取队列中的元素print(q.get())  
# 输出:1print(q.get())  
# 输出:2# 向队列添加元素,队列已满时会阻塞# 
q.put(4)  
# 阻塞# 使用非阻塞模式向队列添加元素(如果队列满了则抛出异常)
try:q.put_nowait(4)
except queue.Full:print("队列已满")# 使用非阻塞模式从队列获取元素(如果队列空则抛出异常)
try:print(q.get_nowait())
except queue.Empty:print("队列为空")
2.2 阻塞与非阻塞

put(block=True, timeout=None): 将元素放入队列,默认阻塞直到有空间可用。

    • block=False:立即返回,如果队列已满会抛出 queue.Full 异常。
    • timeout: 如果设置了 timeout,在等待 timeout 时间后仍未能放入元素,则抛出 queue.Full 异常。

get(block=True, timeout=None): 从队列中取出元素,默认阻塞直到有元素可取。

    • block=False:立即返回,如果队列为空会抛出 queue.Empty 异常。
    • timeout: 如果设置了 timeout,在等待 timeout 时间后仍未能获取元素,则抛出 queue.Empty 异常。
示例:阻塞和非阻塞
import timeimport queueq = queue.Queue(maxsize=3)# 异步加入任务
def producer():for i in range(5):print(f"生产者生产了 {i}")q.put(i)  # 可能会阻塞time.sleep(1)# 异步获取任务
def consumer():while True:try:item = q.get(timeout=2)  # 设置超时,2秒内没有任务就抛出异常print(f"消费者消费了 {item}")q.task_done()except queue.Empty:print("队列为空,消费者停止")breakimport threadingproducer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)producer_thread.start()
consumer_thread.start()producer_thread.join()
consumer_thread.join()

3. queue.LifoQueue(LIFO队列)

LifoQueue 是后进先出(LIFO)队列,行为类似于栈。元素的获取顺序是反向的,先入的元素最后被取出。

示例:LIFO 队列
import queue# 创建 LIFO 队列
q = queue.LifoQueue()# 添加元素
q.put(1)
q.put(2)
q.put(3)# 获取元素print(q.get())  
# 输出:3print(q.get())  
# 输出:2

4. queue.PriorityQueue(优先级队列)

PriorityQueue 是一个基于优先级的队列。每个元素都是一个 (priority, data) 元组,其中 priority 是优先级,数值越小的优先级越高。队列会按照优先级的顺序返回元素。

示例:PriorityQueue 队列
import queue# 创建优先级队列
pq = queue.PriorityQueue()# 插入元素(优先级, 数据)
pq.put((3, 'task 3'))
pq.put((1, 'task 1'))
pq.put((2, 'task 2'))# 获取元素,按优先级顺序
print(pq.get())  # 输出:(1, 'task 1')print(pq.get())  # 输出:(2, 'task 2')print(pq.get())  # 输出:(3, 'task 3')
示例:自定义优先级队列
import queue# 创建优先级队列
pq = queue.PriorityQueue()# 插入元素(优先级, 数据)
pq.put((5, 'task 5'))
pq.put((1, 'task 1'))
pq.put((3, 'task 3'))# 获取元素,按优先级顺序
print(pq.get())  # 输出:(1, 'task 1')print(pq.get())  # 输出:(3, 'task 3')print(pq.get())  # 输出:(5, 'task 5')

5. 队列的常见方法

5.1 put()

将元素添加到队列末尾。

q.put(10)  # 将元素10添加到队列

5.2 get()

从队列中取出元素。

item = q.get()  # 获取并移除队列中的第一个元素

5.3 task_done()

调用 task_done() 来通知队列任务已完成。当使用 join() 来等待队列中所有任务完成时,必须调用 task_done()。

q.task_done()  # 通知任务完成

5.4 join()

join() 会等待队列中所有任务完成后再返回,通常与 task_done() 配合使用。

q.join()  # 阻塞直到队列中所有任务完成

5.5 empty()

检查队列是否为空。

is_empty = q.empty()  # 返回 True 如果队列为空

5.6 full()

检查队列是否已满。

is_full = q.full()  # 返回 True 如果队列已满

6. 使用 queue 模块的最佳实践

线程安全:queue 模块中的队列类(Queue、LifoQueue、PriorityQueue)是线程安全的,可以在多线程环境下使用。不要使用普通的列表替代队列。

使用 task_done() 和 join():如果你在多线程中使用队列,确保每个任务完成后调用 task_done(),并在主线程中使用 join() 等待所有任务完成。

处理 queue.Empty 和 queue.Full 异常:使用非阻塞方式时,务必捕获并处理 queue.Empty 或 queue.Full 异常,以避免程序崩溃。

Python 的 queue 模块提供了线程安全的队列类,适用于多线程编程中数据交换的需求。常用的队列有 queue.Queue(FIFO)、queue.LifoQueue(LIFO)和 queue.PriorityQueue(优先级队列)。通过正确使用这些队列类型和相关方法,可以有效地管理多线程任务和数据流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489242.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造高效Android远程开发环境:一键部署Docker-Android并发布公网

文章目录 前言1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

EFAK kafka可视化管理工具部署使用

简介:EFAK是开源的可视化和管理软件。它允许您查询、可视化、提醒和探索您的指标,无论它们存储在何处。简单来说,它为您提供了将 Kafka 集群数据转换为漂亮的图形和可视化效果的工具。 环境:①操作系统:CentOS7.6&…

【机器人】轨迹规划 之 spline 规划

在轨迹规划中,使用 spline (通常是指通过样条曲线进行轨迹规划)可以实现平滑、连续的路径。以下是使用样条(如B样条、三次样条插值)的具体方法和步骤,结合一个简单的例子说明: 示例场景&#xf…

重生之我在异世界学编程之C语言:深入文件操作篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 函数递归与迭代 引言正文一、为什么要用文件二、文…

【Linux】Systemtap在CentsOS9上测试成功了

在Ubuntu上测试没有成功,先看看运行成功的效果吧: 看到运行的效果,可以安心些,哈哈 指导操作来源于这里:SystemTap 主要来源于这里: https://sourceware.org/systemtap/SystemTap_Beginners_Guide/using-s…

厦门凯酷全科技有限公司深耕抖音电商运营

在数字经济飞速发展的今天,抖音电商平台以其独特的社交属性和庞大的用户基础,迅速成为众多品牌和商家的新战场。在这个充满机遇与挑战的市场中,厦门凯酷全科技有限公司凭借其专业的服务、创新的理念和卓越的执行力,成为了抖音电商…

Vue Web开发(五)

1. axios axios官方文档 异步库axios和mockjs模拟后端数据,axios是一个基于promise的HTTP库,使用npm i axios。在main.js中引入,需要绑定在Vue的prototype属性上,并重命名。   (1)main.js文件引用 imp…

【NextJS】路由之拦截路由(Intercepting Routes) - 简仿花瓣网

拦截路由(Intercepting Routes) link: https://nextjs.org/docs/app/building-your-application/routing/intercepting-routes 概念 拦截路由允许在当前布局中加载应用程序其他部分的路由,即在不切换用户上下文的情况下显示路由内容。例如&am…

【Vulkan入门】14-ShowBySDL

文章目录 先叨叨关键代码Git信息main.cpp 运行结果接下来我会做什么重构代码在b站出一套视频 先叨叨 上篇我们让Vulkan渲染了一个三角形,但还没有把它显示出来。本篇介绍一下,如何使用SDL将这个图形显示出来。 原理其实很简单,就是将渲染的内…

GESP202412 四级【Recamán】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 四级] Recamn 题目描述 小杨最近发现了有趣的 Recamn 数列,这个数列是这样生成的: 数列的第一项 a 1 a_1 a1​ 是 1 1 1;如果 a k − 1 − k a_{k-1}-k ak−1​−k 是正整数并且没有在数…

OpenCV实验:图片加水印

第二篇:图片添加水印(加 logo) 1. 实验原理 水印原理: 图片添加水印是图像叠加的一种应用,分为透明水印和不透明水印。水印的实现通常依赖于像素值操作,将水印图片融合到目标图片中,常用的方法…

OpenCV 功能函数介绍 (二)

一,梯度处理的sobel算子函数 功能: 用于计算图像梯度(gradient)的函数 参数: cv2.Sobel(src, ddepth, dx, dy, ksize3, scale1, delta0, borderTypeNone) cv2.Sobel(输入图像 , 应该是灰…

MySQL有哪些高可用方案?

大家好,我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

鸿蒙项目云捐助第二讲鸿蒙图文互动基本程序实现

鸿蒙项目云捐助第二讲鸿蒙图文互动基本程序实现 结合第一讲建立的“Hello World”程序,得到如下图所示的界面。 这里的“Hello World”是通过“Priview”显示出来的。在这个界面中进行开发的前奏曲,可以通过点击更换图片的案例来体会一下鸿蒙Next的开发…

厦门凯酷全科技有限公司正规吗靠谱吗?

随着短视频和直播电商的迅猛发展,越来越多的企业开始将目光投向抖音这一平台。作为国内领先的短视频社交平台,抖音凭借其庞大的用户基础和强大的算法推荐系统,成为众多品牌拓展市场、提升销售的重要渠道。厦门凯酷全科技有限公司(…

计算机网络从诞生之初到至今的发展历程

前言 "上网",相信大家对这个动词已经不再陌生,网 通常指的是网络;在 2024 年的今天,网络已经渗透到了每个人的生活中,成为其不可或缺的一部分;你此时此刻在看到我的博客,就是通过网络…

django——admin后台管理1

一、admin后台管理 访问url进入: http://127.0.0.1:8000/admin ​ 创建超级管理用户 终端输入以下命令: python manage.py createsuperuser (py36_pingping) E:\django学习\day03-django入门\demo>python manage.py createsuperuser Username: mo…

如何保证数据库和缓存双写一致性?

数据库和缓存(redis)双写数据一致性问题再高并发的场景下,是一个很严重的问题,无论在工作中,还是面试,遇到的概率非常大,这里就聊一聊目前的常见解决方案以及最优方案。 常见方案 缓存的主要目…

Java基础知识(四) -- 面向对象(上)

1.概述 Java语言是一种面向对象的程序设计语言,而面向对象思想(OOP)是一种程序设计思想,在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。 面向对象思…

【数据结构与算法】Java描述:学数据结构与算法你需要预备的知识点!!!

这篇文章主要介绍 什么是数据结构,算法的时间复杂度,空间复杂度计算,包装类的装箱拆箱, 泛型语法,以及擦除机制。 目录 一、什么是数据结构 二、时间复杂度,空间复杂度 2.1 时间复杂度,空间…