问题描述
我的代码如下:
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楼
从 :
请记住,将项目放入队列的进程将在终止之前等待,直到所有缓冲的项目由“ feeder”线程馈送到基础管道为止。 [...]
这意味着每当您使用队列时,都需要确保 在加入该进程之前, 将最终删除所有已放入队列的项目 。 否则,您无法确定将项目放入队列的进程将终止。 还请记住,非守护进程将自动加入。
换句话说,每当您使用队列时,正确的方法是首先使用get()
,然后再使用join()
。
有关示例,请参阅文档。