Проблемы с использованием очередей в python при получении объектов для пропуска очереди - PullRequest
0 голосов
/ 24 января 2011

Прямо сейчас я реализую поток, который в основном будет действовать как потребитель. Будет очередь FIFO, которая будет заполнена другими потоками. Проблема в том, что я хочу добавить специальное условие, которое заставит элемент полностью пропустить очередь.

def EventThread (threading.Thread):
    def __init__ (self, counter_object):
        super (EventThread, self).__init__ ()
        self.queue = Queue.Queue ()
        self.priority = threading.Event ()
        self.item = None
        self.counter = counter.object

    def add_to_queue (self, item):
        self.queue.put (item)

    def do_priority (self, item)
        self.item = item
        self.priority.set ()
        # do something here to block until priority goes back

    def run (self):
        while True:
            # Wait for open event slots
            if not self.counter.has_slots ():
                time.sleep (self.counter.next_slot ())

            # Block until queue has something
            item = self.queue.get (True)

            # If priority is set we need to do that first
            if self.priority.is_set ():
                 do_something_special (self.item)
                 self.priority.clear ()
            else:
                 do_something (item)

            # first if priority was set we lost the object
            # second the thread blocks until the queue has an object, doesn't
            # metter if priority has been set

Это просто какой-то псевдокод, чтобы уточнить мою точку зрения. Но, как вы видите, здесь есть большие проблемы. Не нужно беспокоиться о счетчике, только этот поток обращается к нему.

Здесь мне действительно нужен какой-то способ заставить поток блокироваться до тех пор, пока либо не переключится приоритетный элемент, либо очередь не получит элемент. Я довольно новичок в многопоточности, поэтому я не знаю ни одного объекта, который бы соответствовал моим потребностям, или какой-либо хитрости, чтобы это осуществить.

Большое спасибо всем, кто может помочь.

1 Ответ

2 голосов
/ 24 января 2011

Вы смотрели на PriorityQueue ?

...