【问题标题】:How to identify if Python Threads with Queue are done with task?如何识别带有队列的 Python 线程是否已完成任务?
【发布时间】:2018-12-10 04:46:37
【问题描述】:

这里我有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")

【问题讨论】:

    标签: python python-3.x multithreading python-2.7 python-multithreading


    【解决方案1】:

    你需要等到所有线程都调用完Thread.join

    如何:

    • 用类常量替换你的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
      

    你需要检查“all done”的方式:

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

    【讨论】:

    • 感谢 Roman,我如何获得回报 True ? , AttributeError: 'MazeRunner' object has no attribute 'check_completed'lets_try = MazeRunner() print(lets_try.check_completed())
    • @ArbazzHussain,看看我的更新(你需要检查你的线程完成的方式)
    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多