2012-10-12 8 views
5

マルチプロセッシングを使用して誤ってcreating processes without limitになった場合、OSはそれを好まないでしょう。マルチプロセス "暴走バグ"の防止

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

私はWindowsを使用していますが、私はそれを間違えたときに本当にひどく(ハード再起動が必要です)動作します。だから私は周りに折り返す/私のアプリケーションに追加することができ、これが起こるのを防ぐいくつかのコードがあるなら、私はそれを愛するだろう。

+0

これはウィンドウの質問の場合、なぜLinuxにタグ付けされていますか? – tMC

+0

理想的には私はLinux用のソリューションとWindows用のソリューションがほしいからです!申し訳ありませんが、私はそれについてはっきりしていませんでした...明らかに50%のソリューションは何もないよりも優れています。 – max

答えて

3

あなたができることは、短い「トリップワイヤ」タイプのモジュールを作成し、それをマルチプロセッシングと同様にインポートすることです。トリップワイヤモジュールは、マルチプロセッシングの無限ループを検出すると例外を発生させます。

鉱山は、次のようになります。

#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ファイルに:Windows上

import mp_guard 
1

Linuxでは、setrlimit(2)システムコール(RLIMIT_NPROC)を使用してプロセス数を制限できます(例:fork bombsを避ける)。このシステムコールは、bash ulimit(またはzsh limit)を介してインターフェイスされています。 Pythonはこのシステムコールに対してbindingを持っています。

Windowsで似たようなものがあるかどうかはわかりません。

+1

私が言うことができる限り、Windows用のものはありません...それらのためのもの:-( – ephemient

+0

Windowsがシャットダウンモードになっても、プロセスの増殖を止めることはできないようです。 Windows 7がシャットダウンしようとしているときに新しいユーザー作成プロセスをブロックするのは簡単だと思います... – max

+1

Linuxはこの問題を抱えていません。 –

1

あなたがpythonで私は専​​門家ではない、 "ジョブ" を作成することができ、だから私はtheresがWindowsジョブを作成するためのバインディングであるかどうかはわかりません。 Windows API関数はCreateJobObjectです。ジョブオブジェクトは、(ある程度は)Unixの「プロセスグループ」と同等です。ジョブオブジェクト全体とプロセスごとに個別に制限を適用できます(ジョブ内の最大プロセスなど)。ジョブオブジェクトを作成し、プロセス数の上限を割り当てて、独自のプロセスをジョブオブジェクトに割り当てることができます。あなたが探しすることができることはCreateJobObjectSetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESSです。繰り返しますが、これはWindows APIです。これらの関数に関連するPythonへのバインディングがあるかどうかはわかりません。