Python 队列(Queue)基本操作与多线程并发实战

阿澈
阿澈
发布时间:2026-10-12 | 3人浏览过
原创

本文详解 Python 内置 queue.Queue 类的核心接口,包含元素入队出队、非阻塞读写及容量状态检测,并通过多线程脚本展示如何构建稳定的生产者-消费者架构,有效规避并发编程中的资源竞争与阻塞卡顿问题。

Queue 队列的基础操作与状态判断

Python 标准库中的 queue.Queue 是线程安全的先进先出(FIFO)数据结构。创建时可指定 maxsize 限制最大容量;若传入 0 或负数,则视为无上限存储(实际受系统可用内存约束)。

from queue import Queue

# 初始化容量为 5 的队列
q = Queue(5)

# 存入不同类型的数据
q.put(123)
q.put('hello world!')
q.put(['hello', 'world'])
q.put(('a', 'b'))
q.put({'key': 'value'})

使用 q.get() 可按存入顺序逐一取出元素:

# 依次取出全部元素
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
依次调用get取出队列元素的终端输出
元素按 FIFO 原则依次被读取并输出

当队列达到设定的容量上限时,默认的 q.put() 会发生阻塞挂起,直到有线程取出元素腾出空间。查看当前元素数量可使用 q.qsize(),同时 q.full() 和 q.empty() 可用于快速判定队列状态:

print(f'初始大小: {q.qsize()}')
for _ in range(5):
    print(f'取出后大小: {q.qsize()}')
    q.get()

print(f'是否已满: {q.full()}')
print(f'是否为空: {q.empty()}')
qsize连续调用递减的输出结果
每执行一次 get 操作,队列长度随之一一递减

第1步:启用非阻塞读写模式

目的:避免在任务紧急时因队列满载或清空导致的程序挂起。
入口与动作:将 q.put() 替换为 q.put_nowait(data),将 q.get() 替换为 q.get_nowait()。
参数与状态:当无法立即满足插入或读取条件时,该方法不会等待,而是直接抛出 Full 或 Empty 异常。开发者需在 try-except 块中捕获该异常并编写降级或重试逻辑。

多线程环境下的生产者-消费者模型

在数据采集、日志轮转等场景中,通常需要异步协作处理数据流。queue.Queue 内部自带锁机制,天然支持多线程安全通信。通过固定容量的队列串联两个线程,可实现生产端与消费端的解耦与速率匹配,防止内存爆表或 CPU 空转。

from queue import Queue
import threading
import time

# 生产者:定时向队列写入数据
def producer(q):
    num = 0
    while True:
        q.put(num)
        num += 1
        print(f'[生产者] 放入: {num-1}')
        time.sleep(1)

# 消费者:持续从队列提取并处理数据
def consumer(q):
    while True:
        data = q.get()
        print(f'[消费者] 取出并处理: {data}')

if __name__ == '__main__':
    q = Queue(maxsize=4)  # 设置缓冲池上限
    t_producer = threading.Thread(target=producer, args=(q,), daemon=True)
    t_consumer = threading.Thread(target=consumer, args=(q,), daemon=True)

    t_producer.start()
    t_consumer.start()
双线程交替输出数据的控制台截图
生产者每秒插入数值,消费者实时接收,验证异步流水线运作效果

启动上述脚本后,终端将交替打印双方日志。由于设置了 maxsize=4,当缓冲区满时生产者的 put() 会自动阻塞,从而反压控制前端采集频率;待消费者处理完毕后自动释放空间恢复运行。此模式广泛用于爬虫中间件、消息队列代理及后台批处理任务。

以上就是 Python 队列基本操作与多线程应用的详细内容,更多关于 Python 并发编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表