Python中如何实现阻塞式优先队列

2023-04-11 00:00:00 队列 阻塞 如何实现

在Python中,可以通过queue模块来实现阻塞式优先队列。queue模块包含了多种队列实现,其中PriorityQueue类就是阻塞式优先队列的实现。

下面是一个例子:

import queue
import threading

# 创建一个优先队列
q = queue.PriorityQueue()

# 生产者线程函数,向队列中添加元素
def producer():
    for i in range(5):
        item = "pidancode.com-" + str(i)
        # 将元素添加到队列中,第一个参数为优先级,数字越小优先级越高
        q.put((i, item))
        print("Added", item)
    # 发送一个结束信号
    q.put((-1, None))

# 消费者线程函数,从队列中取出元素并处理
def consumer():
    while True:
        item = q.get()
        # 如果收到结束信号,则退出循环
        if item[1] is None:
            print("Received end signal, quitting")
            break
        print("Processing", item[1])
        q.task_done()

# 创建一个生产者线程并启动
producer_thread = threading.Thread(target=producer)
producer_thread.start()

# 创建多个消费者线程并启动
num_consumers = 2
consumer_threads = []
for i in range(num_consumers):
    t = threading.Thread(target=consumer)
    consumer_threads.append(t)
    t.start()

# 等待生产者线程和队列中的所有元素都被处理完
producer_thread.join()
q.join()

# 等待所有消费者线程结束
for t in consumer_threads:
    t.join()

在这个例子中,我们创建了一个优先队列q,并启动了一个生产者线程producer和两个消费者线程consumer。producer向队列中添加了5个元素,consumer从队列中取出元素并处理。处理完一个元素后,会调用q.task_done()方法告知队列该元素已经处理完毕。

由于优先队列是阻塞式的,所以如果队列为空,consumer线程会一直阻塞等待直到队列中有元素可取。当队列中的所有元素都被处理完毕后,q.join()方法会阻塞等待直到队列为空。最后,我们等待所有线程都结束后退出。

相关文章