5

マルチプロセッシングを使用していて、うっかり無制限にプロセスを作成してしまうと、OS はそれを好まないでしょう。

これが起こらないようにする簡単な解決策はありますか (たとえば、Python または OS でプロセスの総数を制限することによって)?

私は Windows を使用していますが、そのような間違いを犯すと、動作が非常に悪くなります (ハード リブートが必要です)。したがって、ラップアラウンド/アプリケーションに追加して、これが起こらないようにすることができるコードがあれば、それが大好きです。

4

3 に答える 3

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
于 2012-10-15T01:27:46.723 に答える
1

Linuxでは、setrlimit(2) syscall(with RLIMIT_NPROC)を使用して、プロセスの数を制限できます(たとえば、フォーク爆弾を回避するため)。このシステムコールは、組み込みのbash ulimit(またはzsh )を介してインターフェースされます。limitPythonには、このシステムコールへのバインドがあります。

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 に答える