如何将对象 to/from 入队和出队 python 3 中的优先级队列

How to enqueue and dequeue objects to/from a priority queue in python 3

我正在 python 3 中编写一个程序来对称为数据包的对象进行入队和出队。这些数据包具有与其关联的优先级,我希望优先级队列按优先级顺序使数据包出队。下面是代码:

if(pkt.pktId != -1):
      print("pktID: ", pkt.pktId, "srcID :", pkt.srcID)
      arbiter1.put(pkt.pri, pkt)

      while ((arbiter1.empty()==False) and (queueList[0].full()==False)):
           x= arbiter1.get()
           queueList[0].put(arbiter1.get())

Pkt 是 Packet Class() 类型,包含多个字段。其中一个字段是 pri。

当我出列 "x" 并打印 x 时,它给我一个 int 而不是对象 pkt。

我假设您使用的是 stdlib priority queue class:

import queue
arbiter1 = queue.PriorityQueue()

在这种情况下,当您调用 arbiter1.put(pkt.pri, pkt) 时,您实际上是将优先级整数作为 "item" 传递,并将数据包作为 "block" 标志传递:

def put(self, item, block=True, timeout=None):
    ...

相反,您可以传递元组:

arbiter1.put((pkt.pri, pkt))

并取出元组:

priority, pkt = arbiter1.get()

如果数据包没有定义任何顺序并且可能有具有相同优先级的数据包,那么您还需要在元组中使用决胜局。简单的整数就可以了

import itertools
tiebreaker = itertools.count()

arbiter1.put((pkt.pri, next(tiebreaker), pkt))
priority, _, pkt = arbiter1.get()