5

如果您使用多处理并意外地最终创建无限制的进程,操作系统将不喜欢它。

是否有任何简单的解决方案可以防止这种情况发生(例如,通过限制 Python 或操作系统中的进程总数)?

我使用 Windows,当我犯这样的错误时,它的行为非常糟糕(需要硬重启)。因此,如果有一些代码可以环绕/添加到我的应用程序并防止这种情况发生,我会很高兴。

4

3 回答 3

3

您可以做的是创建一个简短的“trip-wire”类型模块并导入它以及多处理。如果检测到多处理无限循环,trip-wire 模块将引发异常。

我的看起来像这样:

#mp_guard.py
"""tracks invocation by creating an environment variable; if that
variable exists when next called a loop is in progress"""

import os

class Brick(Exception):
    def __init__(self):
        Exception.__init__(self, "Your machine just narrowly avoided becoming"
                                 " a brick!")

if 'MP_GUARD' in os.environ:
    raise Brick

os.environ['MP_GUARD'] = 'active'

在主 .py 文件中:

import mp_guard
于 2012-10-15T01:27:46.723 回答
1

在 Linux 上,您可以使用setrlimit(2)系统调用(with RLIMIT_NPROC)来限制进程的数量(例如,避免分叉炸弹)。此系统调用通过 bash ulimit(或 zsh limit)内置接口连接。Python对这个系统调用有一些绑定。

我不知道 Windows 下是否存在类似的东西。

于 2012-10-12T05:23:19.613 回答
1

在windows上你可以创建“一份工作”,我不是python专家,所以我不知道是否有任何用于创建windows工作的绑定。Windows API 函数是CreateJobObject。作业对象(在某种程度上)相当于 Unix“进程组”。您可以对整个作业对象应用某些限制,也可以对每个进程单独应用某些限制(例如作业中的最大进程数)。您可以创建一个作业对象,为其分配进程数限制,然后将您自己的进程分配给该作业对象。您可能正在寻找的是CreateJobObjectSetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS. 再说一遍:这是 Windows API,我不确定你是否有与这些函数相关的 python 的“绑定”。

于 2012-10-15T02:50:11.220 回答