Python3:超出资源限制时出现异常或返回代码?

Posted

技术标签:

【中文标题】Python3:超出资源限制时出现异常或返回代码?【英文标题】:Python3: Exception or return code when resource limit exceeded? 【发布时间】:2016-11-16 15:35:02 【问题描述】:

我正在运行 python 3.4.3。我有一个可能运行很长时间的子进程,或者生成的文件太大。我有这个代码。

def setlimits():
    if DEBUG:
        print("Setting resource limit in child (pid 0)".format(os.getpid()))
    resource.setrlimit(resource.RLIMIT_CPU, (.05, .05))  # CPU time in secs
    resource.setrlimit(resource.RLIMIT_FSIZE, (1000000, 1000000)) # file size
    resource.setrlimit(resource.RLIMIT_NOFILE, (20, 20)) # Number open files

然后我用这段代码调用子进程(在一个更大的例程中)。

        rc = None
        try:
            rc = subprocess.call(["potentially long-running command"],shell=True, preexec_fn=setlimits) 
        except Exception as err:
            print("Exception happened")
            rc = -1
        print("rc = 0".format(str(rc)))

当我为它提供一个运行时间很长的进程时,它不会给我一个例外。 (根据资源文档,我预计会出现 OSError。)它给了我一个 rc=137。

知道这是在哪里记录的吗?我当然想知道我已经涵盖了所有案例;我需要if rc>128-type 检查吗?

【问题讨论】:

【参考方案1】:

137 是一个reserved exit code,表示进程已被杀死 - 它等于 128 + 9(其中 9 代表信号 9 或 SIGKILL)。这很可能发生在进程达到其硬 CPU 限制并被内核杀死时。

subprocess.call() 如果被调用进程以非零退出状态返回,则不会引发异常。如果您想要这种行为,最好使用subprocess.check_call()subprocess.run(..., check=True),这将在非零退出状态下引发CalledProcessError

【讨论】:

以上是关于Python3:超出资源限制时出现异常或返回代码?的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除重复项时出现超出范围异常

运行 Pig 脚本时出现异常

进行预览时出现 Bigquery API 限制超出错误

如何使用 maven jvmArg 解决“超出 GC 开销限制”?

请求 gmail-api 时出现 HttpError 429:超出用户速率限制

在 ASP.NET Core 中呈现 RDLC 报告时出现索引超出范围异常