当前位置: 代码迷 >> python >> Python:使用join和Queue的多线程有时会永远阻塞
  详细解决方案

Python:使用join和Queue的多线程有时会永远阻塞

热度:17   发布时间:2023-07-14 08:43:54.0

我的代码如下:

def PreDutyCycleSolve(self, procCount):
    z = self.crystal.z

    #D1 = np.empty(len(z))
    #D2 = np.empty(len(z))

    D1D2q = multiprocessing.Queue()
    procs = []
    for proc in range(procCount):
        p = multiprocessing.Process(target=self.DutyCycleSolve,
                                    args=(proc,
                                          z[proc::procCount],
                                          D1D2q))
        procs.append(p)

    for proc in procs:
        proc.start()

    for proc in procs:
        proc.join()

    while D1D2q.empty() is False:
        x = D1D2q.get()
        print x

我有一个函数DutyCycleSolve ,该函数被分割并从中运行(在我的例子中,是四个进程)。 问题是,取决于数组的长度z,有时,代码只会被卡住,而不会继续经过proc.join 我已经验证了(通过在self.DutyCycleSolve中打印一些文本,使self.DutyCycleSolve始终返回,并且进程始终从该函数退出。

似乎它从函数中退出,然后(有时)卡在join

有什么想法吗? 我是新来的。

谢谢。

从 :

请记住,将项目放入队列的进程将在终止之前等待,直到所有缓冲的项目由“ feeder”线程馈送到基础管道为止。 [...]

这意味着每当您使用队列时,都需要确保 在加入该进程之前, 将最终删除所有已放入队列的项目 否则,您无法确定将项目放入队列的进程将终止。 还请记住,非守护进程将自动加入。

换句话说,每当您使用队列时,正确的方法是首先使用get() ,然后再使用join() 有关示例,请参阅文档。

  相关解决方案