@[python](Python 的 queue 模块使用笔记)
Python 的 queue 模块提供了同步队列实现,用于在多线程编程中安全地交换数据。以下是 queue 模块的一些主要类型和用法。
一、queue 模块
queue 模块包含以下几种类型的队列:
- queue.Queue:先进先出(FIFO)队列。
- queue.LifoQueue:后进先出(LIFO)队列,类似于栈。
- queue.PriorityQueue:优先级队列,按优先级顺序处理元素。
二、示例代码
2.1. queue.Queue
这是一个典型的 FIFO 队列示例:
import time import threading import queue # 创建一个 FIFO 队列 qFifo = queue.Queue(maxsize=10) def producer(): for i in range(10): qFifo.put(i) print(f'Produced {i}') time.sleep(1) def consumer(): while True: item = qFifo.get() if item is None: break print(f'Consumed {item}') qFifo.task_done() # 创建生产者和消费者线程 prod_thread = threading.Thread(target=producer) cons_thread = threading.Thread(target=consumer) prod_thread.start() cons_thread.start() prod_thread.join() # 停止消费者线程 qFifo.put(None) cons_thread.join()
2.2. queue.LifoQueue
这是一个后进先出(LIFO)队列示例:
import queue import threading import time # 后进先出(LIFO)队列 qLifo = queue.LifoQueue(maxsize=10) def producer(): for i in range(10): qLifo.put(i) print(f'Produced {i}') time.sleep(1) def consumer(): while True: item = qLifo.get() if item is None: break print(f'Consumed {item}') qLifo.task_done() # 创建生产者和消费者线程 prod_thread = threading.Thread(target=producer) cons_thread = threading.Thread(target=consumer) prod_thread.start() cons_thread.start() prod_thread.join() # 停止消费者线程 qLifo.put(None) cons_thread.join()
2.3. queue.PriorityQueue
这是一个优先级队列示例:
import queue import threading import time # 优先级队列,按优先级顺序处理元素 qPrio = queue.PriorityQueue() def producer(): for i in range(10): qPrio.put((i, f'Item {i}')) print(f'Produced Item {i}') time.sleep(1) def consumer(): while True: item = qPrio.get() if item is None: break priority, value = item print(f'Consumed {value}') qPrio.task_done() # 创建生产者和消费者线程 prod_thread = threading.Thread(target=producer) cons_thread = threading.Thread(target=consumer) prod_thread.start() cons_thread.start() prod_thread.join() # 停止消费者线程 qPrio.put(None) cons_thread.join()
三、主要方法
- put(item, block=True, timeout=None):将 item 放入队列。block 和 timeout 控制是否阻塞。
- get(block=True, timeout=None):从队列中取出一个 item。block 和 timeout 控制是否阻塞。
- task_done():标记一个任务已经完成。必须在 get() 后调用。
- join():等待队列中所有任务完成。
这些队列类型和方法可以在多线程程序中有效地管理数据交换。