24-3-Python多线程-线程队列-queue模块
moboyou 2025-06-07 16:56 29 浏览
3-1-概念
queue模块提供了多线程编程中的队列实现,队列是线程安全的数据结构,能在多线程环境下安全地进行数据交换。
3-2-queue 的队列类型
- Queue(先进先出队列)、
- LifoQueue(后进先出队列,类似栈)、
- PriorityQueue(优先队列)
3-3-Queue(先进先出队列)
3-3-1-常用方法
编号 | 方法名 | 方法说明 |
1 | __init__(maxsize=0) | 创建队列实例, `maxsize` 是队列的最大容量, 若为 0 则表示无限制 |
2 | put(item, block=True, timeout=None) | 将 `item` 放入队列。 若 `block` 为 `True` 且队列已满,会阻塞直到有空间; 若 `timeout` 有值,则最多阻塞 `timeout` 秒,超时会抛出 `Full` 异常。 若 `block` 为 `False`,队列满时会立即抛出 `Full` 异常 |
3 | get(block=True, timeout=None) | 从队列中取出并返回一个元素。 若 `block` 为 `True` 且队列为空,会阻塞直到有元素; 若 `timeout` 有值,则最多阻塞 `timeout` 秒,超时会抛出 `Empty` 异常。 若 `block` 为 `False`, 队列为空时会立即抛出 `Empty` 异常 |
4 | qsize() | 返回队列中元素的大致数量 |
5 | empty() | 判断队列是否为空,若为空返回 `True`,否则返回 `False` |
6 | full() | 判断队列是否已满,若已满返回 `True`,否则返回 `False` |
7 | Queue.task_done() | 在完成一项工作之后,函数Queue.task_done()向任务已经完成的队列发送一个信号。 这意味着之前入队的一个任务已经完成。 由队列的消费者线程调用。每一个get()调用得到一个任务时,接下来的task_done()调用告诉队列该任务已经处理完毕。 如果当前一个join() 正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。 |
8 | Queue.join() | 实际上,这意味着等到队列为空时,再执行别的操作。 它会阻塞调用线程,直到队列中的所有任务处理完。 只要有数据加入队列,未完成的任务数就会增加。 当消费者线程调用task_done()时(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。 当未完成的任务数降到0时,join()解除阻塞 |
3-3-2-示例代码
代码
import queue
import threading
import time
# 创建一个队列
q = queue.Queue(maxsize=3)
# 生产者线程函数
def producer():
for i in range(5):
q.put(i)
print(f"生产者放入元素 {i}")
time.sleep(1)
# 消费者线程函数
def consumer():
while True:
item = q.get()
print(f"消费者取出元素 {item}")
q.task_done() # 标记任务完成
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 等待生产者线程结束
producer_thread.join()
# 等待队列中所有任务完成
q.join()
# 结束消费者线程(这里只是示例,实际中可能需要更优雅的方式)
consumer_thread.join(timeout=1)
输出结果
3-4-LifoQueue(后进先出队列)
LifoQueue的方法和 Queue 基本相同,不过它遵循后进先出的原则。
3-4-1-示例代码
代码
import queue
# 创建一个后进先出队列
lifo_q = queue.LifoQueue()
# 放入元素
lifo_q.put(1)
lifo_q.put(2)
lifo_q.put(3)
# 取出元素
while not lifo_q.empty():
print(lifo_q.get())
输出结果
3 2 1
3-5-PriorityQueue(优先队列)
PriorityQueue中的元素会按照优先级排序,优先级低的元素先被取出。
元素一般是元组 (priority, item) 的形式,priority是优先级。
3-5-1-示例代码
代码
import queue
# 创建一个优先队列
priority_q = queue.PriorityQueue()
# 放入元素,元组第一个元素是优先级
priority_q.put((3, '任务3'))
priority_q.put((1, '任务1'))
priority_q.put((2, '任务2'))
# 取出元素
while not priority_q.empty():
print(priority_q.get())
这些队列类在多线程编程中非常实用,能帮助你实现线程间的安全数据交换和任务调度。
输出结果
3-6-数据结构-FIFO队列
3-6-1-概念
FIFO(先进先出)队列是一种常见的数据结构,遵循先进入队列的元素先出队的原则。
Python 的标准库 queue 模块提供了 Queue 类来实现 FIFO 队列,同时 collections 模块里的 deque 也能当作 FIFO 队列使用
3-6-2-应用场景
FIFO 队列在很多场景下都有应用,例如:
任务调度:在多线程或多进程编程中,可以使用 FIFO 队列来存储待执行的任务,确保任务按照提交的顺序依次执行。
消息传递:在分布式系统或多线程应用中,FIFO 队列可以用于线程间或进程间的消息传递,保证消息的顺序性。
3-6-3-常用方法
3-6-3-1-使用 queue.Queue
queue.Queue 是线程安全的,适合在多线程编程中使用
代码
import queue
# 创建一个 FIFO 队列
q = queue.Queue()
# 往队列中添加元素
q.put(1)
q.put(2)
q.put(3)
# 从队列中取出元素
while not q.empty():
item = q.get()
print(item)
输出结果
代码分析
put() 方法用于向队列添加元素,get() 方法用于从队列中取出元素,empty() 方法用于检查队列是否为空。
3-6-3-2-使用 collections.deque
collections.deque 是一个双端队列,也可以当作 FIFO 队列使用。它的操作效率较高,并且支持多线程环境。
代码
from collections import deque
# 创建一个 FIFO 队列
q = deque()
# 往队列中添加元素
q.append(1)
q.append(2)
q.append(3)
# 从队列中取出元素
while q:
item = q.popleft()
print(item)
print('------------')
q.append(1)
q.append(2)
q.append(3)
while q:
item = q.pop()
print(item)
输出结果
3-6-4-案例
代码
import queue
import threading
# 创建一个 FIFO 队列
q = queue.Queue()
# 生产者线程函数
def producer():
for i in range(5):
q.put(i)
print(f"Produced {i}")
# 消费者线程函数
def consumer():
while True:
item = q.get()
if item is None:
break
print(f"Consumed {item}")
q.task_done()
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 等待生产者线程完成
producer_thread.join()
# 发送结束信号给消费者线程
q.put(None)
# 等待消费者线程完成
consumer_thread.join()
输出结果
代码分析
生产者线程往队列中添加元素,消费者线程从队列中取出元素进行处理。
通过 task_done() 方法和 join() 方法可以确保所有任务都被处理完毕
相关推荐
- 运维从头到尾安装日志服务器,看这一篇就够了
-
一、rsyslog部署1.1)rsyslog介绍Linux的日志记录了用户在系统上一切操作,看日志去分析系统的状态是运维人员必须掌握的基本功。rsyslog日志服务器的优势:1、日志统一,集中式管理...
- 被MySQL慢日志查询搞废了?3分钟教你快速定位慢查询问题
-
一条慢查询会造成什么后果?刚开始使用MySQL的开发、初级DBA以为就是简单的查询变慢些,体验稍微有一丢丢影响,殊不知,慢查询的破坏力远不止如此。业务高峰期,这头SQL还没处理完,大量新的查询请求堆...
- Linux 查看系统日志 执行日志 安全日志 history 登录日志
-
修改history记录打开配置文件vim/etc/profile或~/.bash_profile显示执行的用户及其IP添加,将下面内容添加到末尾USER_IP=`who-uami2>/...
- Linux系统日志的简单分析(linux系统日志文件有哪些)
-
为了保证Linux系统正常运行、准确解决遇到的各种各样的系统问题,认真地读取日志文件是系统管理员的一项非常重要的任务。因为日志文件能够详细记录系统每天发生的各种各样的事件。用户可以通过日志文件检查错误...
- 如何按天切割日志文件(日志切割命令)
-
简单明了,直接开始,给热爱编程的你我apache修改httpd.conf对以下两行进行调整ErrorLog"|/usr/local/apache/bin/rotatelogs/data/...
- Apache 记录请求响应时间日志(apache日志查看)
-
本文章向大家介绍Apache记录请求响应时间日志,主要包括Apache记录请求响应时间日志使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。官网介绍在A...
- Linux系统LOG日志分析与管理(四)——配置Loganalyzer
-
摘要:Loganalyzer是一款syslog日志和其他网络事件数据的Web前端工具。它提供了对日志的浏览、搜索、基本分析和一些图表报告的功能。其分析所需数据可以从数据库或一般的syslog文本文件中...
- PHP-FPM 学习记录(php.fpm)
-
什么是FastCGI请阅读FastCGI(FastCommonGatewayInterface)的理解这里不再赘述什么是(PHP-FPM)PHP5.4之前只是用来管理php-cgi进程的进程管理...
- Nginx access_log 运行日志查询和配置
-
1.介绍当我们学会Nginx的基本配置之后,可以通过Nginx配置Service代理。管理服务器所有的http和https请求。那么接下来就需要了解Nginx的日志控制,以及相关的文档查看了。你通过...
- PHP 单例模式(php单例模式和工厂模式)
-
单例模式(SingletonPattern)单例模式(SingletonPattern):顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向...
- PHP之单例模式(php 单例模式优点及如何实现)
-
单例模式属于创建型模式,何为创建型模式,即创建型模式抽象了实例化过程。他们帮助一个系统独立于如何创建、组合和表示他的那些对象。一个类创建型模式使用继承改变被实例化的类。而一个对象创建型模式将实例化委托...
- 2022年SEO还需要交换友情链接吗(seo还有用吗)
-
友情链接是什么意思?这是一个古老的话题,但对于现在的正规网站依然行之有效,本篇详细讲讲2022年对友情链接的理解与操作。今天,小小课堂网(www.xxkt.org.cn)带来的是《2022年SEO...
- 基于maxkb实现对话一键生成docx分析报告,支持图片和表格
-
通过扩展maxkb的知识库管理和ai对话能力,实现一键生成分析报告及word文档;本次优化点在于:实现用户输入多个问题,一键生成分析报告,并提供word文件将内容下载下来word中支持markdown...
- 新版证书查询系统源码 支持自适应多端
-
TP开发证书查询系统适用于各行业相关证书查询,基于ThinkPHP开发,可以同时多字段区配查询,后台管理界面清新,可批量导入导出数据,格式为:JSON、CSV、Excel等,自适应手机端,PC端...
- Rocky Linux 9 源码包安装php8(rocksdb 源码)
-
RockyLinux9源码包安装php8大家好,我是星哥!今天咱们不聊yum一键安装的“快餐式”部署,来点儿硬核的——源码编译安装PHP8.3。为什么要折腾源码?因为它能让你深度定制PHP功能...
- 一周热门
- 最近发表
- 标签列表
-
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle两个表 (20)
- oracle 数据库 字符集 (20)
- oracle安装补丁 (19)
- matlab化简多项式 (20)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- css class选择器用法 (25)
- css样式引入 (30)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- php小说爬取源码 (23)
- 云电脑app源码 (22)
- html画折线图 (24)
- docker好玩的应用 (28)
- linux有没有pe工具 (34)
- mysql数据库源码 (21)