El 01/03/2011 19:47, Pepe Aracil escribió:
Hola lista.
Necesito montar una cola con prioridad, para esto esta el módulo heapq.
Pero el caso es que necesito de vez en cuando cancelar entradas de la cola.

Se me ha ocurrido meter en un "set" las entradas canceladas y comparar la
salida del heapq con dicho "set" y desecharla si está cancelada.

¿Alguna idea mejor?


No se si mejor, pero a veces vamos matando moscas a cañonazos. No se si será este el caso.

Esta es una clase que hice para encolar funciones con sus argumentos pero es valida para cualquier otra cosa. Utiliza prioridades, es sencilla y fácilmente adaptable:

PRMAXIMA = 0
PRALTA = 25
PRMEDIA = 50
PRBAJA = 75
PRMINIMA = 100
DEFAULTPR = PRMEDIA

class JobQueue(object):
    def __init__(self):
        self._Queues = {}

    def Add(self, job, priority = DEFAULTPR, *args, **kargs):
        if not priority in self._Queues:
            self._Queues[priority] = []
        self._Queues[priority].append((job, args, kargs))

    def NextJob(self):
        if self._Queues:
            job = self._Queues[min(self._Queues)].pop(0)
            if not self._Queues[min(self._Queues)]:
                self._Queues.pop(min(self._Queues))
            return job
        return None

    def Remove(self, job, priority = DEFAULTPR, *args, **kargs):
        self._Queues[priority].remove((job, args, kargs))
        if not self._Queues[priority]:
            self._Queues.pop(priority)

    def RemoveAll(self):
        self._Queues = {}

    def RemovePriority(self, priority):
        if priority in self._Queues:
            self._Queues.pop(priority)

    def __len__(self):
        return sum([len(self._Queues[q]) for q in self._Queues])


>>> def TestFunc(*args, **dargs):
...     print "TestFunc:", args, dargs
...
>>> Q = JobQueue()
>>> Q.Add(TestFunc, PRBAJA, 1,2,3)
>>> Q.Add(TestFunc, PRMEDIA, arg1="uno", arg2="dos")
>>> Q.Add(TestFunc, PRALTA)
>>>
>>> while 1:
...     job = Q.NextJob()
...     if job:
...         job[0](*job[1], **job[2])
...     else:
...         break
...
TestFunc: () {}
TestFunc: () {'arg1': 'uno', 'arg2': 'dos'}
TestFunc: (1, 2, 3) {}



Saludos,

--
Oswaldo Hernández
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a