[Python-Dev] Priority queue (binary heap) python code

Gustavo Niemeyer niemeyer@conectiva.com
Tue, 25 Jun 2002 13:02:16 -0300


> it takes a whopping four lines of code, if you're a pragmatic
> programmer:

Indeed. Using a tuple directly was a nice idea! I was thinking about a
priority parameter (maybe I'm not that pragmatic? ;-), which is not hard
as well, but one will have to overload the put method to pass the
priority parameter.

import Queue, bisect

class PriorityQueue(Queue.Queue):
    def __init__(self, maxsize=0, defaultpriority=0):
        self.defaultpriority = defaultpriority
        Queue.Queue.__init__(self, maxsize)

    def put(self, item, block=1, **kw):
        if block:
            self.fsema.acquire()
        elif not self.fsema.acquire(0):
            raise Full
        self.mutex.acquire()
        was_empty = self._empty()
	# <- Priority could be handled here as well.
        self._put(item, **kw)
        if was_empty:
            self.esema.release()
        if not self._full():
            self.fsema.release()
        self.mutex.release()

    def _put(self, item, **kw):
	# <- But here seems better
        priority = kw.get("priority", self.defaultpriority)
        bisect.insort(self.queue, (priority, item))

    def _get(self):
        return self.queue.pop(0)[1]

-- 
Gustavo Niemeyer

[ 2AAC 7928 0FBF 0299 5EB5  60E2 2253 B29A 6664 3A0C ]