2011-01-23 2 views
0

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

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 

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

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

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

ответ

2

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

+0

Это, кажется, часть того, что мне нужно, описание было довольно расплывчатым, поэтому я сначала просмотрел его. Но мне нужно, чтобы функция do_priority блокировалась, пока этот первый элемент не был выбран из списка. – msikora

 Смежные вопросы

  • Нет связанных вопросов^_^