У меня есть очередь, которая всегда должна быть готова обрабатывать элементы, когда они добавляются в нее.Функция, которая запускается для каждого элемента в очереди, создает и запускает поток для выполнения операции в фоновом режиме, чтобы программа могла выполнять другие действия.
Однако функция, которую я вызываю для каждого элемента в очереди, просто запускает поток и затем завершает выполнение, независимо от того, завершен ли поток, который он начал.Из-за этого цикл переходит к следующему элементу в очереди, прежде чем программа завершит обработку последнего элемента.
Вот код, чтобы лучше продемонстрировать, что я пытаюсь сделать:
queue = Queue.Queue()
t = threading.Thread(target=worker)
t.start()
def addTask():
queue.put(SomeObject())
def worker():
while True:
try:
# If an item is put onto the queue, immediately execute it (unless
# an item on the queue is still being processed, in which case wait
# for it to complete before moving on to the next item in the queue)
item = queue.get()
runTests(item)
# I want to wait for 'runTests' to complete before moving past this point
except Queue.Empty, err:
# If the queue is empty, just keep running the loop until something
# is put on top of it.
pass
def runTests(args):
op_thread = SomeThread(args)
op_thread.start()
# My problem is once this last line 't.start()' starts the thread,
# the 'runTests' function completes operation, but the operation executed
# by some thread is not yet done executing because it is still running in
# the background. I do not want the 'runTests' function to actually complete
# execution until the operation in thread t is done executing.
"""t.join()"""
# I tried putting this line after 't.start()', but that did not solve anything.
# I have commented it out because it is not necessary to demonstrate what
# I am trying to do, but I just wanted to show that I tried it.
Некоторые примечания:
Это все работает в приложении PyGTK.Когда операция SomeThread завершена, она отправляет обратный вызов в графический интерфейс для отображения результатов операции.
Я не знаю, насколько это влияет на мою проблему, но я подумал, что это может бытьважно.