如何识别带有队列的Python线程是否使用任务完成?

如何识别带有队列的Python线程是否使用任务完成?,python,python-3.x,multithreading,python-2.7,python-multithreading,Python,Python 3.x,Multithreading,Python 2.7,Python Multithreading,这里我有一个MazeRunner类,它将self.box的所有元素放在队列中,并在它们上面运行线程,直到所有队列变为空q.empty() 这里的问题是,我如何真正确定我的程序是否在self.box&returnTrue队列中的所有元素上执行了线程 这看起来很有挑战性,因为我们的线程处于while循环中,它根据我们定义的self.box长度和self.threads保持更改。 我试着把所有的线程都放到列表中,然后把它们全部加入。但不是运气。有什么帮助吗 import threading,queue

这里我有一个
MazeRunner
类,它将
self.box
的所有元素放在队列中,并在它们上面运行线程,直到所有队列变为空
q.empty()

这里的问题是,我如何真正确定我的程序是否在
self.box
&return
True
队列中的所有元素上执行了线程

这看起来很有挑战性,因为
我们的线程
处于while循环中,它根据我们定义的
self.box
长度和
self.threads
保持更改。 我试着把所有的线程都放到列表中,然后把它们全部加入。但不是运气。有什么帮助吗

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)


您需要等待所有线程完成调用:

如何:

  • self.threads=5
    表达式替换为类常量:

    THREAD_NUM = 5
    
  • 将附加属性
    threads
    (用于线程列表)放入
    \uuuu init\uuu
    方法中:

    ...
    self.threads = []
    
  • 将每个创建的线程放入
    threads
    列表:

    for j in range(self.THREAD_NUM):
        t = threading.Thread(target=self.ProcessQueue)
        self.threads.append(t)
        t.start()
    
  • 定义方法,如
    check_completed
    ,以确保所有线程都已终止(完成):

您需要检查“全部完成”的方式:


谢谢罗曼,我怎样才能得到报税表呢
AttributeError:“MazeRunner”对象没有“check\u completed”属性
lets\u try=MazeRunner()打印(lets\u try.check\u completed())
已解决:多亏了@ArbazzHussain,请查看我的更新(检查线程完成的方式)
for j in range(self.THREAD_NUM):
    t = threading.Thread(target=self.ProcessQueue)
    self.threads.append(t)
    t.start()
....

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")