网易首页 > 网易号 > 正文 申请入驻

Python 库手册:queue 线程安全队列模块

0
分享至

Python 的 queue 模块提供了线程安全的队列类,是构建多线程程序时处理任务调度、生产者-消费者模型的理想选择。它支持先进先出(FIFO)、后进先出(LIFO)以及优先级队列等结构,确保多个线程之间安全地共享数据。

常见应用场景:

(1)多线程环境中任务调度与线程通信。

(2)构建生产者-消费者模型。

(3)需要线程间共享数据但避免使用显式锁。

(4)需要带有优先级的任务队列

◆ ◆

核心概念

1、线程安全(Thread-safe)

所有队列操作都是原子级,内部使用锁机制,无需额外加锁。

2、三种队列类型

Queue:先进先出队列(FIFO)

LifoQueue:后进先出队列(栈结构)

PriorityQueue:按优先级出队,较小值优先

3、队列满/空时阻塞与非阻塞

入队和出队操作可选择是否阻塞,默认阻塞直到成功。

4、可设置最大队列长度(maxsize)

防止无限增长导致内存溢出。

◆ ◆

应用举例

例 1: 基础 FIFO 队列操作

import queue

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

q.put(10)
q.put(20)
q.put(30)

print(q.get())  # 输出 10
print(q.get())  # 输出 20

例 2:非阻塞取出元素

import queue

q = queue.Queue()
q.put(1)

try:
    item = q.get_nowait()  # 非阻塞读取
    print(item)
except queue.Empty:
    print("队列为空")

例 3:使用 LifoQueue 实现栈结构

import queue

s = queue.LifoQueue()
s.put('A')
s.put('B')
s.put('C')

print(s.get())  # 输出 C(后进先出)

例 4:使用 PriorityQueue 实现优先级任务调度

import queue

pq = queue.PriorityQueue()
pq.put((2, "中等优先级"))
pq.put((1, "高优先级"))
pq.put((3, "低优先级"))

while not pq.empty():
    print(pq.get()[1])
# 输出顺序:高优先级 -> 中等优先级 -> 低优先级

例 5:多线程中的生产者-消费者模型

import threading
import queue
import time
import random

# 创建一个共享队列
task_queue = queue.Queue(maxsize=5)

# 生产者函数
def producer(name):
    for i in range(10):
        item = f"{name}-任务{i}"
        task_queue.put(item)
        print(f"[生产者{name}] 生产了 {item}")
        time.sleep(random.uniform(0.1, 0.5))  # 模拟生产时间

# 消费者函数
def consumer(name):
    while True:
        try:
            item = task_queue.get(timeout=2)  # 等待任务
            print(f"    [消费者{name}] 消费了 {item}")
            task_queue.task_done()  # 标记任务完成
            time.sleep(random.uniform(0.2, 0.6))  # 模拟处理时间
        except queue.Empty:
            break

# 创建线程
producer_thread = threading.Thread(target=producer, args=("A",))
consumer_threads = [
    threading.Thread(target=consumer, args=("X",)),
    threading.Thread(target=consumer, args=("Y",))
]

# 启动线程
producer_thread.start()
for t in consumer_threads:
    t.start()

# 等待所有线程结束
producer_thread.join()
task_queue.join()  # 等待所有任务完成
print("所有任务处理完成")

◆ ◆

常用方法与属性

Queue(maxsize=0)

创建一个先进先出的线程安全队列。

参数

maxsize:最大容量,0 表示无限制

返回:一个 Queue 对象

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

将一个元素放入队列。

参数

item:要加入队列的元素

block:是否阻塞等待,默认 True

timeout:阻塞时的超时时间(秒)

返回:无。若队列已满且非阻塞模式,会抛出 queue.Full 异常

.get(block=True, timeout=None)

从队列中取出一个元素。

参数

block:是否阻塞等待,默认 True

timeout:阻塞时的超时时间(秒)

返回:队列中的一个元素。若队列为空且非阻塞模式,会抛出 queue.Empty 异常

.put_nowait(item)

非阻塞地将元素放入队列,相当于 put(block=False)。

参数:item 为待入队元素

返回:无

.get_nowait()

非阻塞地从队列中取出一个元素,相当于 get(block=False)。

参数:无

返回:队列中的一个元素,若队列为空,抛出 queue.Empty

.empty()

判断队列是否为空。

参数:无

返回:布尔值

.full()

判断队列是否已满。

参数:无

返回:布尔值

.qsize()

返回当前队列中的元素数量。

参数:无

返回:整数(不一定完全准确,线程切换可能导致状态变化)

◆ ◆

补充说明

queue 模块为多线程程序提供了安全、高效的任务通信机制,避免了手动使用锁带来的复杂性。对于大多数并发队列应用,queue.Queue 已足够使用;若涉及优先级调度或栈结构,PriorityQueue 与 LifoQueue 提供了额外选择。在现代多线程任务分发中,是不可或缺的工具模块。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
今天才知道:家里“这6样”都含有玻璃纤维,危害很大,别再用了

今天才知道:家里“这6样”都含有玻璃纤维,危害很大,别再用了

Home范
2026-08-26 12:16:19
上海市发改委副主任朱明林,拟任新职!施明光,任三明市政府副秘书长、市政府办公室主任!

上海市发改委副主任朱明林,拟任新职!施明光,任三明市政府副秘书长、市政府办公室主任!

健身狂人
2026-08-29 00:42:22
不查不知道一查吓一跳,执掌恒大27年的许家印,私下究竟有多豪

不查不知道一查吓一跳,执掌恒大27年的许家印,私下究竟有多豪

李橑在北漂
2026-08-27 13:27:33
星宇股份校招裁员引众怒:中国资本家为何比国外老牌资本还坏?

星宇股份校招裁员引众怒:中国资本家为何比国外老牌资本还坏?

徐云流浪中国
2026-08-27 16:37:48
已致469死977失联!尼方技术团队确认灾难原因:尼泊尔境内冰川崩塌致山体滑落阻塞河流,决堤后洪水倾泻而下,造成毁灭性灾害

已致469死977失联!尼方技术团队确认灾难原因:尼泊尔境内冰川崩塌致山体滑落阻塞河流,决堤后洪水倾泻而下,造成毁灭性灾害

每日经济新闻
2026-08-28 14:03:23
德转认证!梅西:跨越六届世界杯的传奇丰碑,最伟大的纪录创造者

德转认证!梅西:跨越六届世界杯的传奇丰碑,最伟大的纪录创造者

智道足球
2026-08-27 19:11:44
砸12万美金包机强行挽尊!哈里梅根回国没警察开道,脸都丢尽了

砸12万美金包机强行挽尊!哈里梅根回国没警察开道,脸都丢尽了

白露文娱志
2026-08-27 13:55:30
人民日报:在网上写“小作文”构陷他人,必付出代价

人民日报:在网上写“小作文”构陷他人,必付出代价

蓬勃新闻
2026-08-28 14:25:13
日本驱逐舰沉没大半截!舱室大量进水!

日本驱逐舰沉没大半截!舱室大量进水!

烽火观天下
2026-08-28 12:53:21
洞房夜妻子出上联:人上有人人压人,丈夫的下联让妻子心花怒放

洞房夜妻子出上联:人上有人人压人,丈夫的下联让妻子心花怒放

千秋文化
2026-08-27 20:09:43
这就是赤裸裸的现实!工商银行已经到了最危险的时候?

这就是赤裸裸的现实!工商银行已经到了最危险的时候?

财经保探长
2026-08-23 21:43:55
近期朝阳高发!携带多种病菌,卫生部门建议——

近期朝阳高发!携带多种病菌,卫生部门建议——

家住朝阳
2026-08-28 19:50:44
希拉里嫌特朗普对华软弱!中国不向伊朗施压,美国就该实施制裁

希拉里嫌特朗普对华软弱!中国不向伊朗施压,美国就该实施制裁

叹知
2026-08-29 01:18:28
全球最大岛礁被我国收回,相当于四个深圳大!曾被美、菲合力抢夺

全球最大岛礁被我国收回,相当于四个深圳大!曾被美、菲合力抢夺

铁锤侃侃而谈
2026-08-26 22:12:20
4199元起!华为Mate90四款全部曝光,Pro Max值得冲吗

4199元起!华为Mate90四款全部曝光,Pro Max值得冲吗

时尚的弄潮
2026-08-28 00:48:38
有脑子的小德太凶了!达万给毛伟杰+老毕各来一下,蒙哥马利被锁喉

有脑子的小德太凶了!达万给毛伟杰+老毕各来一下,蒙哥马利被锁喉

刀锋体育
2026-08-28 22:26:08
突然宣布二胎,高调晒出照片,热搜炸了:你俩居然还没离婚?

突然宣布二胎,高调晒出照片,热搜炸了:你俩居然还没离婚?

美芽
2026-08-27 12:10:15
又重伤!几乎赛季报销!他刚拿到大合同啊!

又重伤!几乎赛季报销!他刚拿到大合同啊!

柚子说球
2026-08-27 20:12:49
泰王真的宠贵妃娘娘!泰国王室发布九月海报,85后诗妮娜将去英国

泰王真的宠贵妃娘娘!泰国王室发布九月海报,85后诗妮娜将去英国

八八尚语
2026-08-27 16:55:23
俄军小组渗透12公里,摸到乌军无人机阵地,将整队飞手全部割喉

俄军小组渗透12公里,摸到乌军无人机阵地,将整队飞手全部割喉

影孖看世界
2026-08-27 12:27:49
2026-08-29 02:47:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2104文章数 86关注度
往期回顾 全部

科技要闻

AI牛马永不下班!OpenAI让智能体自己找活

头条要闻

救援队抵达国门反复呼喊有没有人 队员:目视一片废墟

头条要闻

救援队抵达国门反复呼喊有没有人 队员:目视一片废墟

体育要闻

曼城花1个亿,买下了摩洛哥的“国民女婿”

娱乐要闻

景甜分手风波,网友:难怪张继科抽身

财经要闻

刑自强:AI投资下半场中国蓄势待发

汽车要闻

东风日产NX8“喜柿橙意”限定色正式上市

态度原创

家居
房产
健康
游戏
军事航空

家居要闻

2026建博会(广州) 公装联探展交流活动

房产要闻

突发,三亚又大量卖地!

脑出血两大夺命风险,早治早保命!

GTA6实机2K30帧!数毛社赞史上最惊艳 Pro版更强?

军事要闻

"中华第一舰"退出现役

无障碍浏览 进入关怀版