防止多处理“失控的错误”

时间:2012-10-12 05:13:22

标签: python windows linux multiprocessing process

如果您使用多处理并意外地结束creating processes without limit,操作系统将不会喜欢它。

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

我使用Windows,当我犯这样的错误时,它表现得非常糟糕(需要硬重启)。所以我喜欢它,如果有一些代码可以包含/添加到我的应用程序中并防止这种情况发生。

3 个答案:

答案 0 :(得分:3)

您可以做的是创建一个简短的'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

答案 1 :(得分:1)

在Linux上,您可以使用setrlimit(2)系统调用(使用RLIMIT_NPROC)来限制进程数(例如,以避免fork bombs)。此系统调用通过bash ulimit(或zsh limit)内置接口。 Python对此系统调用有一些binding

我不知道Windows下是否存在类似内容。

答案 2 :(得分:1)

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