Python 常用队列全面详细梳理
队列是一种数据结构,它以先进先出的方式来对元素进行排序,一般用于需要处理一组按照先后顺序排列的数据时。Python 中有许多内置的队列类型和库,本篇攻略将对常用队列进行详细梳理。
Python 中的队列类型
list
Python 中最常见的序列类型就是 list,它通过两个方法实现队列的操作:append() 和 pop()。append() 可以用来在队列尾部添加元素,pop() 用于从队列头部移除元素。
示例:
queue = []
queue.append(1)
queue.append(2)
queue.append(3)
queue.pop(0) # 移除队列头部元素
queue.Queue
queue 是 Python 标准库里实现的线程安全的队列,它提供了一些线程安全的队列操作,包括 put() 和 get() 方法,分别用于入队和出队。queue.Queue 支持多线程间的同步,因此在多线程环境下非常实用。
示例:
import threading
import queue
q = queue.Queue()
def worker():
while True:
item = q.get()
if item is None:
break
print(item)
q.task_done()
# 创建新线程
threads = []
for i in range(5):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
# 添加元素到队列中
for item in range(50):
q.put(item)
# 结束线程
q.join()
for i in range(5):
q.put(None)
for t in threads:
t.join()
queue.LifoQueue
LifoQueue 是 queue 模块提供的一种后进先出(LIFO,Last-in-First-out)队列。和 queue.Queue 相比,LifoQueue 只有在使用后进先出的队列时才有用。
示例:
import queue
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get(), q.get(), q.get()) # 输出 3, 2, 1
queue.PriorityQueue
PriorityQueue 是 queue 模块提供的一种带优先级(Priority)的队列。
示例:
import queue
q = queue.PriorityQueue()
q.put((1, "task 1"))
q.put((2, "task 2"))
q.put((0, "task 3"))
print(q.get(), q.get(), q.get()) # 输出 (0, 'task 3') (1, 'task 1') (2, 'task 2')
Python 中的队列库
asyncio.Queue
asyncio 是 Python 核心库提供的库,它提供了异步 I/O 的支持。asyncio.Queue 和 queue.Queue 类似,但它是异步队列。asyncio.Queue 是线程安全的。
示例:
import asyncio
async def produce(queue):
for i in range(10):
await asyncio.sleep(0.1)
item = str(i)
await queue.put(item)
print(f"Produced {item}")
async def consume(queue):
while True:
item = await queue.get()
print(f"Consumed {item}")
queue.task_done()
async def main():
queue = asyncio.Queue()
prod = asyncio.create_task(produce(queue))
cons = asyncio.create_task(consume(queue))
await asyncio.gather(prod)
await queue.join()
cons.cancel()
asyncio.run(main())
multiprocessing.Queue
multiprocessing 是 Python 标准库中的一个专门处理进程的库,它包含了许多与多进程操作有关的模块和方法。multiprocessing 提供了一个 Queue 对象,它可以在进程间使用。与 queue.Queue 类似,multiprocessing.Queue 可以用于在进程之间传递数据。
示例:
from multiprocessing import Process, Queue
import time
def producer(queue):
for i in range(5):
time.sleep(0.5)
item = str(i)
queue.put(item)
print(f"Produced {item}")
def consumer(queue):
while True:
item = queue.get()
print(f"Consumed {item}")
queue.task_done()
if __name__ == '__main__':
queue = Queue()
p1 = Process(target=producer, args=(queue,))
p2 = Process(target=consumer, args=(queue,))
p1.start()
p2.start()
p1.join()
queue.join()
p2.terminate()
总结
本文中我们详细介绍了 Python 中常用的队列类型和库。其中,list、queue.Queue、queue.LifoQueue 和 queue.PriorityQueue 适用于线程间队列操作,而 asyncio.Queue 和 multiprocessing.Queue 适用于异步和多进程队列操作。在选择队列类型时应考虑具体的使用场景。