Как определить, выполняются ли потоки Python с очередью с помощью задачи? - PullRequest
0 голосов
/ 09 декабря 2018

Здесь у меня есть MazeRunner Класс, который помещает все элементы self.boxes в очередь и запускает на них поток, пока вся очередь не станет пустой q.empty().

Здесь проблема заключается в том, как сделатья фактически определяю, завершена ли моя программа, выполняя потоки на всех элементах, которые находятся в очереди self.boxes и возвращают True.

Это выглядит сложным, потому что our threads находятся в цикле while, который сохраняет измененияна основе self.boxes длины & self.threads мы определили.я попытался поместить все темы в список и t.join их всех.Но не удача.Любая помощь?

import threading,queue,time 

class MazeRunner:
    def __init__(self):
        self.q = queue.Queue()
        self.boxes = [1,2,3,4,5,6,7] ## `7` elements of list
        self.threads = 5

        for i in self.boxes:
            self.q.put(i) ### ADDING Every element of list to queue

        for j in range(self.threads): ### for i in range(5)  threads
            t = threading.Thread(target=self.ProcessQueue)
            t.start() ### Started `5` threads on `7` elements

    def ProcessQueue(self):
        while not self.q.empty():
            each_element = self.q.get()
            self.SleepFunction(each_element)
            self.q.task_done()

    def SleepFunction(self,each_element):
        print("STARTING : ",each_element)
        time.sleep(10)
        print("DONE : ",each_element)

lets_try = MazeRunner()
if lets_try == True:
     print("All Threads Done on Elements")

1 Ответ

0 голосов
/ 09 декабря 2018

Вам нужно подождать, пока все потоки не закончат, вызывая Thread.join:

HOWTO:

  • ЗаменитьВаше self.threads = 5 выражение с константой класса:

    THREAD_NUM = 5
    
  • Добавьте дополнительный атрибут threads (для списка потоков) в ваш метод __init__:

    ...
    self.threads = []
    
  • Поместить каждый созданный поток в список threads:

    for j in range(self.THREAD_NUM):
        t = threading.Thread(target=self.ProcessQueue)
        self.threads.append(t)
        t.start()
    
  • Определить метод, например check_completed, чтобы убедиться, что все потоки завершены (сделано):

    ....
    
    def check_completed(self):
        for t in self.threads:
            t.join()
        return True
    

Способ проверки «все сделано»:

m_runner = MazeRunner()
if m_runner.check_completed():
    print("All Threads Done on Elements")
...