Python 当get()和task_done()作为回调传入时,线程程序挂起在Queue.join()上

Python 当get()和task_done()作为回调传入时,线程程序挂起在Queue.join()上,python,multithreading,subprocess,Python,Multithreading,Subprocess,这个脚本曾经将队列作为一个全局对象,可以在线程被实例化的地方和线程函数本身中访问它,但是为了使事情更干净,我以一种更“可接受”的方式重构了事情,并决定传入队列的get()和task_done()方法对线程化函数进行实例化,以消除其全局性;但是,我注意到join()现在会无限期地挂起,而以前当队列是全局队列时,它总是运行到完成并适当地终止 对于完整上下文,以下是源代码: 然而,以下是我认为唯一相关的代码片段;init本质上是我的主要方法,它所属的类拥有队列,而run是正在运行的类转码的方法(我觉得

这个脚本曾经将队列作为一个全局对象,可以在线程被实例化的地方和线程函数本身中访问它,但是为了使事情更干净,我以一种更“可接受”的方式重构了事情,并决定传入队列的get()和task_done()方法对线程化函数进行实例化,以消除其全局性;但是,我注意到join()现在会无限期地挂起,而以前当队列是全局队列时,它总是运行到完成并适当地终止

对于完整上下文,以下是源代码:

然而,以下是我认为唯一相关的代码片段;init本质上是我的主要方法,它所属的类拥有队列,而run是正在运行的类转码的方法(我觉得转码类的其余细节不相关):


这个解决方案非常愚蠢:对于发生的每一个转码,将条目添加到队列中两次

    # give the Queue the right number of task threads to make
    for i in range(self.get_num_transcodes()):
        self.q.put(i)

    # code omitted...

    # testing code to be sure command strings are generating appropriately
    for transcode in self.transcodes:
        self.q.put(transcode)

这是重构留下的痕迹。因此,队列认为它需要的工作线程数量是实际的两倍,并在等待剩余的条目被处理。

对于我来说,这并不是一个玩具示例(创建一个队列,用伪值加载它,将
q.get
q.task\u done
传递给一个线程,在该线程中调用
get
/
done
,并在主线程中调用
join
)。是否有一个工作线程正在抛出一个阻止
done()的异常
。这实际上是我这方面的一个愚蠢的、无关的错误;谢谢你的尝试!在下面发布了解决方案。
    # give the Queue the right number of task threads to make
    for i in range(self.get_num_transcodes()):
        self.q.put(i)

    # code omitted...

    # testing code to be sure command strings are generating appropriately
    for transcode in self.transcodes:
        self.q.put(transcode)