PriorityQueue队列的使用

引言

典型的生产消费者模型都存在队列的概念,在python语言中,提供了queue标准库,该库包含了Queue、FIFO和PriorityQueue三种类型的队列。

优先级处理的对列使用PriorityQueue,使用方法和Queue类似,区别在于放入队列的数据会进行排序,优先级高的数据会优先取出。

使用方法

get方法使用sorted(list(entries))[0]返回数据,所以put的数据类型需要为统一的,可排序的。最简单的是使用tuple,如(priority_number, data)。如果数据不是可比较的,可创建数据类,只比较优先级字段,以下例子使用数据类构造。

  • 定于数据结构如下
from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)

其中,priority为优先级字段,类型为int,数字越小,优先级越高;item为数据字段,可为任意类型。

  • 存入和读取队列
q = queue.PriorityQueue()
q.put(PrioritizedItem(1, 'sample'))
print(q.get())

put数据为数据类构造。

例子

import queue
from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)

q = queue.PriorityQueue()
q.put(PrioritizedItem(1, 'far'))
q.put(PrioritizedItem(40, 'bar'))
q.put(PrioritizedItem(0, 'best'))

# 0是级别最高的,
while not q.empty():
    print(q.get())

输出结果为:

$ python proque.py 
PrioritizedItem(priority=0, item='best')
PrioritizedItem(priority=1, item='far')
PrioritizedItem(priority=40, item='bar')

从结果可以看到优先级为0的数据最先取出。

你可能感兴趣的:(PriorityQueue队列的使用)