Прямо сейчас я реализую поток, который в основном будет действовать как потребитель. Будет очередь 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
Это просто какой-то псевдокод, чтобы уточнить мою точку зрения. Но, как вы видите, здесь есть большие проблемы. Не нужно беспокоиться о счетчике, только этот поток обращается к нему.
Здесь мне действительно нужен какой-то способ заставить поток блокироваться до тех пор, пока либо не переключится приоритетный элемент, либо очередь не получит элемент. Я довольно новичок в многопоточности, поэтому я не знаю ни одного объекта, который бы соответствовал моим потребностям, или какой-либо хитрости, чтобы это осуществить.
Большое спасибо всем, кто может помочь.