【Python】queue模块Queue对象

news2024/10/7 14:33:05

Python中的queue模块是一个同步队列类,实现了多生产者、多消费者队列,适用于在多线程之间安全地传递消息或其他数据。Queue提供了所有必需的锁定语义。

queue模块有三种类型的队列(只是队列中元素的提取顺序不同):先进先出(FIFO)队列,后进先出(LIFO)队列,优先级队列(涉及heapq模块)。

其中:Queue对象 (Queue, LifoQueue, 或者 PriorityQueue) 。

Queue:先进先出(FIFO)。LifoQueue:后进先出(LIFO)。PriorityQueue:优先级队列。

from queue import Queue, LifoQueue, PriorityQueue

[x for x in dir(Queue) if not x.startswith('_')]
# 结果:
['empty', 'full', 'get', 'get_nowait', 'join', 'put', 'put_nowait', 'qsize', 'task_done']

[x for x in dir(LifoQueue) if not x.startswith('_')]
# 结果:
['empty', 'full', 'get', 'get_nowait', 'join', 'put', 'put_nowait', 'qsize', 'task_done']

[x for x in dir(PriorityQueue) if not x.startswith('_')]
# 结果:
['empty', 'full', 'get', 'get_nowait', 'join', 'put', 'put_nowait', 'qsize', 'task_done']

Queue对象的方法:(以queue.Queue()为例)

q = queue.Queue():实例化Queue对象。即线程安全队列,此队列先进先出(队尾进队头出)。可限制队列大小,超过最大限制,则会阻塞;若未提供最大限制,默认maxsize=0,则表示未限制队列大小。

q.qsize():返回队列的大致大小(即队列中有多少元素)。多线程时,其它线程可能正在更新队列,因此只能是队列的大致大小。

q.empty():判断队列是否为空。

q.full():判断队列是否是满的。

q.put(...):将元素添加到队列的队尾中。

q.get():从队列的队头移除一个元素,并返回该元素。即从队列获取元素并从队列移除。

q.task_done():表示之前队列中排队的任务已被执行完毕。即get()获取任务后调用task_done()则告诉队列任务已处理完。

q.join():阻塞到队列中所有元素都被取出且被执行完毕。即队列被处理空,主线程才继续往下执行。

举例:

import threading
import queue

def worker():
    while True:
        # 获取元素(从队头移除元素并返回该元素)
        item = q.get()
        # 打印当前的线程名称和获取的元素
        print(f'Starting {threading.current_thread().name} : item = {item}\n')
        print(f'Finished {threading.current_thread().name} : item = {item}\n')
        # 告诉队列当前的任务已处理完毕
        q.task_done()
        print(f'队列是否为满:{q.full()}, 队列大致大小:{q.qsize()}。\n')

# 线程安全队列,此处未限制队列大小
q = queue.Queue()
print(f'队列是否为空:{q.empty()}\n') 

# 创建4个线程,并发执行
for i in range(4):
    t = threading.Thread(target=worker, name=f'threading{i}')
    t.start()

# 共6个线程:当前主线程,4个创建的线程,1个socketThread
print(f'共有线程{threading.active_count()}个\n {threading.enumerate()}\n')

# 往队尾放入8个元素(0-7)
for item in range(8):
    q.put(item)
    if item == 7: print(f'队列是否为满:{q.full()}, 队列大致大小:{q.qsize()}。\n')

# 等待队列中所有元素都处理完毕,主线程继续往下执行
q.join()

print('All work completed')

结果:

补充:多生产者—多消费者【同步、互斥问题】

固定大小的缓冲区,多个生产者往缓冲区写数据,多个消费者从缓冲区读数据。

生产者先写数据,然后消费者才能读数据。【同步问题】

缓冲区不满,生产者才能写数据。【同步问题】

缓冲区互斥访问。【互斥问题】

结合python:q = queue.Queue():线程安全队列,表示缓冲区。

                      q.put(...):生产者往缓冲区写数据。

                      q.get():消费者从缓冲区读数据。

                      Queue对象 已具备所有必需的“锁”,会为调用者处理锁定。

参考:queue --- 一个同步的队列类 — Python 3.12.0 文档

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小型洗衣机好用吗?最好用的迷你洗衣机

很多人会觉得小型洗衣机是智商税,没有必要专门买一个小型洗衣机来洗内衣,洗个内衣只需要两分钟的事情,需要花个几百块钱去入手一个洗衣机吗?然而清洗贴身衣物的并不是一件简单的事情,如果只是简单的搓洗,内…

Unity Mirror学习(一) SyncVars特性使用

官网中所说的网络对象,指的是挂了 NetworkIdentity组件的对象 官网中所说的玩家对象,指的是NetworkManager脚本上的PlayerPrefab预制体 这个概念对阅读官网文档很重要,我刚开始并不理解,走了歪路 SyncVars(同步变量&a…

wav格式如何转mp3?

wav格式如何转mp3?WAV格式是一种高品质的音频文件格式,其采用无损压缩技术存储音频数据。通常,WAV文件使用PCM编码方式将声音信号转换为数字信号,并按照一定规则存储到文件中。这种编码方式可以确保音频数据的完整性和准确性&…

电脑硬盘数据恢复哪个好?值得考虑的 8 个硬盘恢复软件解决方案

借助硬盘恢复软件,任何人都可以在家中恢复丢失的文件,而无需任何特殊技能。事实上,最困难的一步是选择最佳解决方案,因为可用选项的数量可能有点多。幸运的是,这篇文章可以为您提供帮助。 8 款顶级硬盘数据恢复软件解决…

MemcachedRedis构建缓存服务器 (数据持久化,主从同步,哨兵模式)

Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。降低数据库读的压力 Nsql的优点:高可扩展性,分布式计算,低成本,…

EMERSON艾默生变频器维修M600/M701/M702

艾默生变频器维修常见系列: EV1000 系列:体积小,操作简便,适用于塑料机械、纺织机械、烟草机械、陶瓷机械、制药机械食品机械、印刷机械、包装机械、空调等专用设备配套。 EV2000 系列:功率范围广,功能更…

【Python】数据分析案例:世界杯数据可视化 | 文末送书

文章目录 前期数据准备导入数据 分析:世界杯中各队赢得的比赛数分析:先打或后打的比赛获胜次数分析:世界杯中的抛硬币决策分析:2022年T20世界杯的最高得分者分析:世界杯比赛最佳球员奖分析:最适合先击球或追…

Android—幸运抽奖火箭发射倒计时(第六次作业)

Android—幸运抽奖&&点火发射(第六次作业) 创建项目 准备工作 修改按钮的颜色,如果不修改这行代码,那么后期给按钮添加background属性的时候,按钮并不会发生变化。 设置按钮的样式文件btn_press_blue.xml&am…

innovus/ICC2:实际绕线层次有低于routing rule min layer的情况如何解决?

ICC2 这是因为routing rule的min layer是soft rule,如果希望min layer严格按照设置的来,还需要手动添加如下命令: set_routing_rule -min_layer_mode hard -rule xx [get_nets xx] innovus 设置route type是加入min_stack_layer选项。 create_route_…

react 修改less文件后保存,内存溢出,项目崩溃问题解决

一、完整报错 一个很老的react项目,因为没有package-lock.json版本锁,导致拉下来的时候,安装的依赖版本冲突,好不容易启动起来,修改less文件后只要一保存,项目就会崩溃,需要重启,报…

nginx配置和热部署实践

目录 一、nginx配置文件 1.配置文件 2.nginx配置文件语法 3.include 二、nginx.conf参数 1.user参数 2.nginx.conf重要的指令块 3.nginx命令行 三、nginx热部署功能实践 1.热部署的特点 2.大致流程 3.环境准备 4.备份旧nginx二进制文件 5.下载编译安装新的nginx …

vue:实现顶部消息横向滚动通知

前言 最近有个需求&#xff0c;是在系统顶部展示一个横向滚动的消息通知。需求很简单&#xff0c;就是消息内容从右往左一直滚动。 效果如下&#xff1a; 因为我的需求很简单&#xff0c;功能就这样。如果有什么其他需求&#xff0c;可以再继续修改。 代码 使用 <noti…

SQL表、字段、查询参数获取

SQL工具类表、字段、查询参数提取 1. 执行效果2. 使用2.1 引入依赖2.2 相关实体2.3 工具类 1. 执行效果 2. 使用 2.1 引入依赖 <!-- sql 解析处理--><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifact…

说说你在使用React 过程中遇到的常见问题?如何解决?

一、前言 在使用react开发项目过程中&#xff0c;每个人或多或少都会遇到一些"奇怪"的问题&#xff0c;本质上都是我们对其理解的不够透彻 react 系列&#xff0c;33个工作日&#xff0c;33次凌晨还在亮起的台灯&#xff0c;到今天就圆满画上句号了&#xff0c;比心…

通用工作站设计方案 :807-ORI-S3R500 -多路PCIe3.0的单CPU通用工作站

ORI-S3R500 -多路PCIe3.0的单CPU通用工作站 (研华工业计算机IPC-610&#xff0c;IPC940 升级款) 一、机箱功能和技术指标&#xff1a; 系统 系统型号 ORI-SR500 主板支持 EEB(12*13)/CEB(12*10.5)/ATX(12*9.6)/Mi cro ATX 前置硬盘 最大支持2个3.5寸1个2.5寸SATA …

2024 款:最新前端技术趋势

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 上一次的时候聊了 那么些已经落后的前端开发技术 。但是光知道什么技术落后了是不够的&#xff0c;咱们还得知道 前端最新的技术趋势是什么。所以&#xff0c;今天这篇文章&#xff0c;咱们就来聊一聊&#xff0c;2023 最新…

IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作

文章目录 一、总结区别&#xff08;只针对本地仓库操作&#xff09;Soft详细解释文件版本冲突处理 Mixed详细解释Hard详细解释Keep详细解释文件版本冲突处理 二、其他Revert commit 参考文档 一、总结区别&#xff08;只针对本地仓库操作&#xff09; Soft详细解释 Soft操作只…

Linux本地部署1Panel现代化运维管理面板并实现公网访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

nginx的配置文件说明

nginx的配置文件说明 https://blog.csdn.net/S_ZaiJiangHu/article/details/126838279 https://blog.csdn.net/qq_33454884/article/details/89212702 二、nginx的正向代理和反向代理 2.1 nginx的反向代理 2.1.1 反向代理说明 对于客户端来说&#xff0c;反向代理就好像目标…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应&#xff1f;NVIC如何分配优先级&#xff1f;二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇&#xff0c;用自己的话总结出来清晰易懂&#xff0c;给小白看也能一眼明了&#xff0c;这就是写博客的意义吧…