如何识别带有Queue的Python线程是否使用task完成?

2024-05-16 19:08:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Here problem is how do i actually identify if my program is done performing threads on all elements which are in queue of self.boxes & return True.

它看起来很有挑战性,因为our threads在while循环中,它根据我们定义的self.boxes长度保持变化。 我试着把所有的线程都放在列表中,然后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")

Tags: ofinselffor队列queueondef
1条回答
网友
1楼 · 发布于 2024-05-16 19:08:09

您需要等到所有线程都调用完^{}

方法:

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

相关问题 更多 >