python 子进程意外退出,退出代码为-9

标签 python multithreading python-2.7 multiprocessing pytorch

我有一个包含 16 个进程的 PyTorch 脚本。以下是主流程的代码片段:

procs = [mp.Process(target=self.worker_wrapper, args=(i, )) for i in range(self.n_workers)]
for p in procs: p.start()
while True:
    time.sleep(60)
    for i, p in enumerate(procs):
        self.logger.info('Check: id %d, exitcode %s, alive %s' % (
            i, str(p.exitcode), str(p.is_alive())))

worker_wrapper是这样的:

def worker_wrapper(self, id):
    try:
        self.worker(id)
    except Exception as e:
        self.logger.info(e)
        self.logger.error(traceback.format_exc())

worker 会做一些事情并且永远不应该停止。它一开始运行良好,但通常运行 1 天后,一些子进程(不是全部)意外退出,我得到如下输出:

[2017-06-15 08:45:21,540] Check: id 13, exitcode -9, alive False

并且它没有捕获任何异常。我尝试搜索 exitcode -9 但没有得到任何有用的信息。有人以前遇到过这个吗?或者您知道如何调试这个吗?很抱歉,我无法提供最小的可重现代码片段,因为重现通常需要一天的时间。我使用的是python2.7

最佳答案

退出代码 -9 表示进程已通过 SIGKILL 终止。

这可能是由于您的机器内存不足并且操作系统内核触发了 OOM killer 。

要验证这一点,请通过 dmesg 检查内核日志,您应该会注意到针对您的工作进程的 OOM killer 。

您需要减少应用程序的内存占用(或增加服务器/工作站的内存)。还要验证您的应用程序没有泄漏内存。

关于python 子进程意外退出,退出代码为-9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44576035/

相关文章:

java - 了解执行器服务何时完成所有提交的任务的最佳方法是什么

python - 如何在tensorflow中制作自定义激活函数

python - 根据 RGB 值更改图像的颜色

c++ - 在 C++ 类中创建线程

java - jmeter 参数每个线程只能引用该文件一次

python - 成交量加权移动平均线

python-2.7 - 如果不满足 "If"条件,如何结束代码

python - 使用列的长度过滤 DataFrame

python - 按钮上的图像

python-3.x - Cython 编译器指令 language_level 不受尊重