如果您使用多处理并意外地结束creating processes without limit,操作系统将不会喜欢它。
是否有任何简单的解决方案可以防止这种情况发生(例如,通过限制Python或OS中的进程总数)?
我使用Windows,当我犯这样的错误时,它表现得非常糟糕(需要硬重启)。所以我喜欢它,如果有一些代码可以包含/添加到我的应用程序中并防止这种情况发生。
答案 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相关的任何“绑定”。