Python常用队列全面详细梳理

  • Post category:Python

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 适用于异步和多进程队列操作。在选择队列类型时应考虑具体的使用场景。