44

subprocess.callを使用してPythonプロセスからスポーンする外部コマンドラインアプリが取る時間とCPUを制限する必要があります。これは主に、スポーンされたプロセスがスタックしてCPUを99%に固定することがあるためです。

niceとulimitはこれを行うための合理的な方法のように見えますが、それらがサブプロセスとどのように相互作用するかはわかりません。

  • 制限は次のようになります。
    • 60秒以上かかる場合は、プロセスを強制終了します
    • CPUの20%に制限する
  • サブプロセスを生成するPythonプロセスではなく、サブプロセスにリソース制限を適用したいと思います。

subprocess.callによって生成されたプロセスにniceとulimitを適用する方法はありますか?より良いPythonネイティブの代替手段はありますか?

これはLinux(ubuntu)システム上にあります。

4

3 に答える 3

11

Erikは私に簡単に説明してくれましたが、 Richが指摘したnice部分を忘れていました。パッケージは素晴らしい(しゃれを意図した)と思いますが、残念ながら移植性が低くなります。質問に対する私の見解は次のとおりです。psutil

import os
import psutil
import resource
import subprocess

def preexec_fn():
    pid = os.getpid()
    ps = psutil.Process(pid)
    ps.set_nice(10)
    resource.setrlimit(resource.RLIMIT_CPU, (1, 1))

print "mother pid", os.getpid()
p = subprocess.Popen(["./cpuhog.sh"], preexec_fn=preexec_fn)
p.wait()
print "mother still alive with pid", os.getpid()

ヴィルshell=Trueは私が何となくアレルギーを持っているものを使っていた。多分私はここで年をとって不機嫌になっているだけかもしれませんが、私はそれを避けようとしています!

于 2014-04-06T08:12:15.310 に答える