@[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():等待队列中所有任务完成。
这些队列类型和方法可以在多线程程序中有效地管理数据交换。