Действительно ли это возможно к renice подпроцесс?

Я знаю о os.nice() это работает идеально подходящее для родительского процесса, но я должен сделать renice своих дочерних подпроцессов. Я нашел способ сделать это, но это, кажется, не очень удобно и слишком чрезмерно:

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

И это не возврат, заканчивающийся хороший уровень после renicing.

Там больше очевидного способа к подпроцессам renice в Python?

9
задан Cristian Ciupitu 2 August 2014 в 00:01
поделиться

4 ответа

Используйте параметр 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)
13
ответ дан 4 December 2019 в 11:41
поделиться

Вы должны использовать subprocess.Popen вместо os.system , чтобы вы могли получить доступ к любым результатам, выводимым в sys.stdout. IIRC, os.system дает вам доступ только к возвращаемому значению, которое, вероятно, равно «0», а не к хорошему уровню.

2
ответ дан 4 December 2019 в 11:41
поделиться

renice обычно реализуется командой set/getpriority, которая, похоже, не попала в модуль python os или posix (пока?). Поэтому вызов системной команды renice кажется сейчас лучшим вариантом.

В качестве альтернативы, вы можете os.nice родителя до создания дочернего процесса - который унаследует значение nice своего родителя - и os.nice обратно после создания дочернего процесса.

2
ответ дан 4 December 2019 в 11:41
поделиться

без надлежащих прав вы можете ренировать только одним способом

1
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: