それは、サブプロセスを優先度を調整することは可能ですか?
-
20-09-2019 - |
質問
私はそれが親のための完璧な作品 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)
他のヒント
あなたは、代わりにsubprocess.Popen
のos.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