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

时间:2014-03-10 05:50:31

标签: python multithreading python-2.7

我的代码如下:

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

任何想法为什么?我是新来的。

感谢。

1 个答案:

答案 0 :(得分:1)

来自docs

  

请记住,将项目放入队列的进程将等待   在终止之前,直到所有缓冲的项目都由   “馈线”螺纹到底层管道。 [...]

     

这意味着无论何时使用队列,您都需要确保   最终将删除已放入队列的所有项目   加入流程之前 。否则你不能确定   将项目放入队列的进程将终止。记得   此外,非守护进程将自动加入。

换句话说,无论何时使用队列,正确的方法是先get(),然后join()。请参阅文档以获取示例。