我面临一个非常奇怪的问题。我有多进程python代码,可以并行处理一些数据。我将数据拆分为8并使用Process Class单独处理每个拆分,然后我在每个Process上进行连接。
我刚注意到,当我处理大量数据时,其中一个线程....消失了。因为它不会出错或引发异常,它就会丢失。更有趣的是,当我知道它没有完成的事实时,它似乎成功完成了进程的join()。
tn1_processes = []
for i in range(8):
tn1_processes.append(
MyCustomProcess(logger=self.logger, i=i,
shared_queue=shared_queue))
tn1_processes[-1].start()
for tn1_processor in tn1_processes:
tn1_processor.join()
print('Done')
我肯定知道什么: 所有进程都在启动并正在处理数据并达到大约一半,我知道这是因为我有日志显示所有进程正在完成他们的工作。 然后,进程1从日志中消失,直到它的工作结束,而所有其他的工作正常工作并完成。然后我的代码继续认为所有进程在连接之后完成(我用打印演示了这个)然而我知道其中一个进程没有完成的事实,它没有错误输出并且由于某些奇怪的原因它通过了join()?
我唯一能想到的是Process耗尽内存但我觉得如果发生这种情况会出错或抛出异常。实际上它在使用相同的代码之前发生在我身上,我在日志中看到异常并且代码能够处理并看到进程失败。但是,没有错误或任何事情都很奇怪。
任何人都能解释一下吗?
使用Python3.4
答案 0 :(得分:2)
如果我没记错,当一个进程突然终止它就不会抛出错误时,你需要另外一个queue
来存储引发的异常并在其他地方处理它们。
但是当流程结束时,会给出退出代码:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process.exitcode
初步检查将确保所有这些安全退出(可能以0
作为退出代码,而负数表示终止信号并且None
正在运行)。
答案 1 :(得分:0)
问题是python内存不足。我知道这一点的唯一方法是我在代码运行时监视机器的内存使用情况,并且需要比可用空间更多的空间,因此其中一个进程被杀死,没有任何错误或异常。 @ j4hangir的回答是如何避免这种情况好,我需要检查退出代码。我还没有测试过这个,但我会更新