Я знаю о os.nice()
это работает идеально подходящее для родительского процесса, но я должен сделать renice своих дочерних подпроцессов. Я нашел способ сделать это, но это, кажется, не очень удобно и слишком чрезмерно:
os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )
И это не возврат, заканчивающийся хороший уровень после renicing.
Там больше очевидного способа к подпроцессам renice в Python?
Используйте параметр preexec_fn
подпроцесса .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
, чтобы вы могли получить доступ к любым результатам, выводимым в sys.stdout. IIRC, os.system
дает вам доступ только к возвращаемому значению, которое, вероятно, равно «0», а не к хорошему уровню.
renice обычно реализуется командой set/getpriority, которая, похоже, не попала в модуль python os или posix (пока?). Поэтому вызов системной команды renice кажется сейчас лучшим вариантом.
В качестве альтернативы, вы можете os.nice родителя до создания дочернего процесса - который унаследует значение nice своего родителя - и os.nice обратно после создания дочернего процесса.
без надлежащих прав вы можете ренировать только одним способом