Python 队列(Queue)基本操作与多线程并发实战
本文详解 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())

当队列达到设定的容量上限时,默认的 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()}')

第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 并发编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













