Python中如何实现阻塞式优先队列
在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()方法会阻塞等待直到队列为空。最后,我们等待所有线程都结束后退出。
相关文章