我的代码如下:
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
。
任何想法为什么?我是新来的。
感谢。
答案 0 :(得分:1)
来自docs:
请记住,将项目放入队列的进程将等待 在终止之前,直到所有缓冲的项目都由 “馈线”螺纹到底层管道。 [...]
这意味着无论何时使用队列,您都需要确保 最终将删除已放入队列的所有项目 加入流程之前 。否则你不能确定 将项目放入队列的进程将终止。记得 此外,非守护进程将自动加入。
换句话说,无论何时使用队列,正确的方法是先get()
,然后join()
。请参阅文档以获取示例。