Я заметил, что не могу использовать PriorityQueue для объектов? - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть ADT (PCB или блок управления процессом), я хочу поместить их в очередь с приоритетами.Как мне это сделать?

Я уже использовал Как поместить элементы в очереди с приоритетами? , чтобы иметь вторичный приоритет для обеспечения правильного упорядочения очереди.Здесь я могу сделать PCB сопоставимой, но в другом классе это может не иметь смысла?В таком случае, что я могу сделать?

ОБНОВЛЕНИЕ

Мой код очень похож на тот, который выложен https://stackoverflow.com/a/9289760/292291

class PCB:
    ...

# in my class extending `PriorityQueue`
PriorityQueue.put(self, (priority, self.counter, pcb))

Я думаю, чтопроблема в том, что pcb все еще не сравним здесь

1 Ответ

6 голосов
/ 19 февраля 2012

ОК, просто чтобы закрыть этот вопрос.Вот что я сделал:

Сделайте ADT сопоставимым: Реализация __lt__().

def __lt__(self, other):
    selfPriority = (self.priority, self.pid)
    otherPriority = (other.priority, other.pid)
    return selfPriority < otherPriority

Таким образом, я могу просто использовать queue.put(obj)

Я обнаружил, что @larsmans прав, говоря:

", если приоритети счетчик всегда сопоставимы, и никакие два счетчика никогда не имеют одинаковое значение, тогда вся тройка сопоставима"

jiewmeng@JM:~$ python3.2
Python 3.2.2 (default, Sep  5 2011, 21:17:14) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Test:
...     def __init__(self, name):
...             self.name = name
... 
>>> from queue import PriorityQueue
>>> q = PriorityQueue()

# duplicate priorities triggering unorderable error
>>> q.put((2, Test("test1")))
>>> q.put((1, Test("test1")))
>>> q.put((3, Test("test1")))
>>> q.put((3, Test("test1")))
>>> q.put((3, Test("test2")))
>>> while not q.empty():
...     print(q.get().name)
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/lib/python3.2/queue.py", line 195, in get
    item = self._get()
  File "/usr/lib/python3.2/queue.py", line 245, in _get
    return heappop(self.queue)
TypeError: unorderable types: Test() < Test()

# unique priority fields thus avoiding the problem
>>> q = PriorityQueue()
>>> q.put((3, Test("test1")))
>>> q.put((5, Test("test5")))

>>> while not q.empty():
...     print(q.get()[1].name)
... 
test1
test5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...