菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python queue 模块

在 Python 中,queue 模块提供了一个线程安全的队列实现,用于在多线程编程中安全地传递数据。

队列是一种先进先出(FIFO)的数据结构,queue 模块提供了多种队列类型,包括 QueueLifoQueuePriorityQueue,以满足不同的需求。


队列类型

1. Queue

Queuequeue 模块中最常用的队列类型,它实现了标准的先进先出(FIFO)队列。以下是 Queue 的基本用法:

实例

import queue

# 创建一个队列
q = queue.Queue()

# 向队列中添加元素
q.put(1)
q.put(2)
q.put(3)

# 从队列中获取元素
print(q.get()) # 输出: 1
print(q.get()) # 输出: 2
print(q.get()) # 输出: 3

2. LifoQueue

LifoQueue 是一种后进先出(LIFO)的队列,类似于栈。以下是 LifoQueue 的基本用法:

实例

import queue

# 创建一个 LIFO 队列
q = queue.LifoQueue()

# 向队列中添加元素
q.put(1)
q.put(2)
q.put(3)

# 从队列中获取元素
print(q.get()) # 输出: 3
print(q.get()) # 输出: 2
print(q.get()) # 输出: 1

3. PriorityQueue

PriorityQueue 是一种优先级队列,元素按照优先级顺序被取出。以下是 PriorityQueue 的基本用法:

实例

import queue

# 创建一个优先级队列
q = queue.PriorityQueue()

# 向队列中添加元素,元素为元组 (优先级, 数据)
q.put((3, 'Low priority'))
q.put((1, 'High priority'))
q.put((2, 'Medium priority'))

# 从队列中获取元素
print(q.get()) # 输出: (1, 'High priority')
print(q.get()) # 输出: (2, 'Medium priority')
print(q.get()) # 输出: (3, 'Low priority')

常用方法

1. put(item, block=True, timeout=None)

item 放入队列。如果 blockTrue 且队列已满,则等待 timeout 秒,直到队列有空闲空间。如果 timeoutNone,则无限等待。

2. get(block=True, timeout=None)

从队列中获取并移除一个元素。如果 blockTrue 且队列为空,则等待 timeout 秒,直到队列中有元素。如果 timeoutNone,则无限等待。

3. qsize()

返回队列中的元素数量。

4. empty()

如果队列为空,返回 True,否则返回 False

5. full()

如果队列已满,返回 True,否则返回 False


线程安全

queue 模块的所有队列类型都是线程安全的,这意味着多个线程可以安全地同时操作同一个队列,而不需要额外的同步机制。这使得 queue 模块成为多线程编程中传递数据的理想选择。


示例:多线程队列

以下是一个使用 Queue 在多线程之间传递数据的示例:

实例

import queue
import threading
import time

# 创建一个队列
q = queue.Queue()

# 生产者线程
def producer():
for i in range(5):
print(f'生产 {i}')
q.put(i)
time.sleep(1)

# 消费者线程
def consumer():
while True:
item = q.get()
if item is None:
break
print(f'消费 {item}')
q.task_done()

# 启动生产者线程
producer_thread = threading.Thread(target=producer)
producer_thread.start()

# 启动消费者线程
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()

# 等待生产者线程完成
producer_thread.join()

# 等待队列中的所有任务完成
q.join()

# 发送结束信号
q.put(None)
consumer_thread.join()

常用的属性和方法

以下是 Python queue 模块(线程安全队列)的常用类、方法及属性的表格说明,包含功能描述和示例:

queue 模块核心类

说明适用场景
queue.Queue先进先出(FIFO)队列通用任务队列
queue.LifoQueue后进先出(LIFO)队列(类似栈)需要后进先出的场景
queue.PriorityQueue优先级队列(最小堆实现)按优先级处理任务
queue.SimpleQueue更简单的FIFO队列(Python 3.7+)不需要高级功能的场景

通用方法(所有队列类都支持)

方法说明示例返回值
put(item)放入元素q.put("task1")None
get()取出并移除元素item = q.get()队列元素
empty()判断队列是否为空if q.empty():True/False
full()判断队列是否已满if q.full():True/False
qsize()返回队列当前大小size = q.qsize()整数
task_done()标记任务完成(用于join())q.task_done()None
join()阻塞直到所有任务完成q.join()None

阻塞控制参数

参数说明默认值示例
block当队列为空/满时是否阻塞Trueq.get(block=False)
timeout阻塞超时时间(秒)Noneq.put(x, timeout=5)

PriorityQueue 专用用法

元素格式:(priority, data),优先级越小越先出队

实例

pq = queue.PriorityQueue()
pq.put((1, "low"))
pq.put((0, "high"))
print(pq.get()[1]) # 输出: "high"

实例

生产者-消费者模型:

实例

import queue, threading

q = queue.Queue(maxsize=3) # 容量为3的队列

def producer():
for i in range(5):
q.put(f"Task-{i}")
print(f"Produced: Task-{i}")

def consumer():
while True:
item = q.get()
print(f"Consumed: {item}")
q.task_done()

threading.Thread(target=producer, daemon=True).start()
threading.Thread(target=consumer, daemon=True).start()
q.join() # 等待所有任务完成

优先级任务处理:

实例

pq = queue.PriorityQueue()
pq.put((3, "Scan"))
pq.put((1, "Emergency"))
pq.put((2, "Log"))

while not pq.empty():
print(pq.get()[1]) # 输出顺序: Emergency → Log → Scan

非阻塞获取(避免死锁):

实例

try:
item = q.get_nowait() # 等价于 q.get(block=False)
except queue.Empty:
print("队列为空")
AI 思考中...

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /