Как ставить в очередь и удалять объекты из очереди приоритетов в python 3 - PullRequest
1 голос
/ 08 апреля 2020

Я пишу программу на 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.

1 Ответ

1 голос
/ 09 апреля 2020

Я предполагаю, что вы используете очередь приоритетов stdlib класс:

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()

Если для пакетов не определен какой-либо порядок и могут быть пакеты с одинаковыми приоритетами, то вы также можете использовать в кортеже ie -breaker. Простые целые числа будут работать

import itertools
tiebreaker = itertools.count()

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