質問

私はそれが親のための完璧な作品 os.nice() を知っていますプロセスが、私は私の子供のサブプロセスののreniceを行う必要があります。私はこれを行う方法を見つけたが、非常に便利な、あまりにも過度にならないように思わます:

os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )

そして、それはrenicing後に素敵なレベルを結果として返されません。

Pythonでサブプロセスを優先度を調整するために、よりクリーンな方法はありますか?

役に立ちましたか?

解決

preexec_fnするsubprocess.Popenパラメータを使用します>
  preexec_fnが呼び出し可能オブジェクトに設定されている場合は、

、このオブジェクトは、子が実行される直前に子プロセスで呼び出されます。 (UNIXのみ)

例:

>>> Popen(["nice"]).communicate()
0
(None, None)
>>> Popen(["nice"], preexec_fn=lambda : os.nice(10)).communicate()
10
(None, None)
>>> Popen(["nice"], preexec_fn=lambda : os.nice(20)).communicate()
19
(None, None)

他のヒント

あなたはsys.stdoutに印刷されたすべての結果にアクセスできるように

あなたは、代わりにsubprocess.Popenos.systemを使用する必要があります。 IIRC、os.systemはあなたがおそらく「0」ではなく素敵なレベルでの戻り値にアクセスできます。

のreniceは、通常のdoesnれ、セット/ getpriority にすることによって実現されます「Tは、PythonのOSやPOSIXモジュール(まだ?)にそれを作っているように見えます。だから、のreniceシステムコマンドを呼び出すと、今、あなたの最善の策のように思える。

あなたは子プロセスを作成する前に、

別の方法として、あなたは親をos.nice可能性 - その親nice値を継承れる - 。あなたは子プロセスを作成した後に再びとos.niceを

あなたは、一方向にのみをreniceでき、適切な権限のない

私は過去にCLIでPythonスクリプトを作成しました。あなたはここでそれを見つけることができます: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.pyする

  

のreniceは通常のpython OSやPOSIXモジュール(まだ?)にそれを作ったようには見えないセット/ getpriority、によって実装されます。だから、のreniceシステムコマンドを呼び出すと、今、あなたの最善の策のように思える。

ctypesについてのダニエルさんのコメントを拡大ます:

from ctypes import cdll
libc = cdll.LoadLibrary("libc.so.6")

for pid in pids:
    print("old priority for PID", pid, "is", libc.getpriority(0, pid))
    libc.setpriority(0, pid, 20)
    print("new priority for PID", pid, "is", libc.getpriority(0, pid))

結果:

old priority for PID 9721 is 0
new priority for PID 9721 is 19
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top