引言
典型的生产消费者模型都存在队列的概念,在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的数据最先取出。