在Python中,queue模块是用于实现队列数据结构的标准库模块。它提供了多种队列实现,用于在多线程环境中安全地传递数据。
Queue
:这是最常用的队列实现,也称为先进先出(FIFO)队列。它提供了线程安全的操作方法,包括放入元素到队列尾部和从队列头部获取元素。
LifoQueue
:这是后进先出(LIFO)队列,也称为栈。与普通队列不同,LifoQueue在放入和获取元素时遵循后进先出的原则。
PriorityQueue
:这是一个带有优先级的队列实现。元素插入时可以指定优先级,值越小表示优先级越高。当获取元素时,优先级高的元素会被优先返回。
from queue import Queue
# 创建一个队列对象
q = Queue()
# 将元素放入队列中
q.put('item')
# 从队列中获取并移除一个元素(如果队列为空,会阻塞)
item = q.get()
print(item)
# 检查队列是否为空
if q.empty():
print("队列为空")
else:
print("队列不为空")
from queue import Queue
# 设置队列的最大长度(如果不指定最大长度,则默认为无限)
q = Queue(maxsize=10) # 设置最大长度为10
# 将元素放入队列中
q.put('item1')
q.put('item2')
q.put('item3')
print(q.qsize())
from queue import LifoQueue
# 创建一个队列对象
q = LifoQueue()
# 将元素放入队列中
q.put('item1')
q.put('item2')
q.put('item3')
print(q.get()) # item3
print(q.get()) # item2
print(q.get()) # item1
from queue import PriorityQueue
# 创建一个队列对象
q = PriorityQueue()
# 将元素放入队列中,设置元素的优先级(值越小,优先级越高)
q.put((5, 'item1'))
q.put((3, 'item2'))
q.put((4, 'item3'))
print(q.get()) # (3, 'item2')
print(q.get()) # (4, 'item3')
print(q.get()) # (5, 'item1')
from queue import PriorityQueue
# 创建一个队列对象
q = PriorityQueue()
# 将元素放入队列中
q.put((5, 'item1'))
q.put((3, 'item2'))
q.put((4, 'item3'))
items = list(q.queue)
print(items)
from queue import Queue
import threading
import time
q = Queue()
def consumer():
while True:
item = q.get()
if item is None:
break # 遇到空元素表示任务结束,退出循环
# 处理任务...
print(f"消费数据:{item}")
time.sleep(2)
def producer():
for i in range(5):
q.put(i) # 生产一个元素放入队列
print(f'生产数据:{i}')
time.sleep(1)
# 创建生产者线程和消费者线程
t_p = threading.Thread(target=producer)
t_c = threading.Thread(target=consumer)
# 启动线程
t_p.start()
t_c.start()
# 等待生产者线程生产任务完成
t_p.join()
# 生产者线程运行完毕后,会在队列中添加一个空元素,表示生产任务全部完成
q.put(None)
# 等待消费者线程消费任务完成
t_p.join()
我们创建了一个queue.Queue
对象作为生产者和消费者之间的共享队列。生产者函数producer()
循环产生一些元素,并将这些元素放入队列中,然后睡眠1秒。消费者函数consumer()
从队列中获取元素并打印出来,然后睡眠2秒。主线程创建生产者线程和消费者线程,并启动它们。生产者线程运行完毕后,会在队列中添加一个空元素,表示生产任务全部完成。然后等待消费者线程处理完剩余的元素,并最终结束。
打印结果: