【问题标题】:Preventing multiprocessing "runaway bugs"防止多处理“失控错误”
【发布时间】:2012-10-02 21:21:27
【问题描述】:

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

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

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

【问题讨论】:

  • 如果这是一个 Windows 问题 - 为什么它被标记为 Linux?
  • 因为理想情况下我想要一个适用于 Linux 的解决方案和一个适用于 Windows 的解决方案!抱歉,我并不清楚……显然,50% 的解决方案总比没有好。

标签: python windows linux multiprocessing process


【解决方案1】:

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

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

【讨论】:

  • 据我所知,Windows 不存在任何东西......对他们来说很糟糕:-(
  • 如果是这样,那确实很糟糕。即使 Windows 进入关机模式,它似乎也无法阻止进程的扩散。您会认为 Win 7 在尝试关闭时很容易阻止任何新的用户创建进程...
  • Linux 没有这个问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2013-05-05
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多