Возможно ли переименовать подпроцесс?
Я знаю, о os.nice()
он отлично работает для родительского процесса, но мне нужно сделать renice моих дочерних подпроцессов. Я нашел способ сделать это, но, похоже, это не очень удобно и слишком чрезмерно:
os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )
и не возвращать полученный хороший уровень после renicing.
есть ли более чистый способ переименования подпроцессов в python?
6 ответов
вы должны использовать subprocess.Popen
вместо os.system
, поэтому вы можете получить доступ к любым результатам, напечатанным в sys.стандартный вывод. IIRC,os.system
только дает вам доступ к возвращаемому значению, которое, вероятно, '0', а не хороший уровень.
renice обычно реализуется set/getpriority, который, похоже, не попал в ОС python или модуль posix(пока?). Поэтому вызов системной команды renice кажется вам лучшим выбором сейчас.
в качестве альтернативы вы можете os.nice родитель, прежде чем создать дочерний процесс, который унаследует его родители nice value и os.приятно снова после создания дочернего процесса.
Я создал скрипт python с CLI в прошлом. Вы можете найти его здесь: https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py
renice обычно реализуется set/getpriority, который, похоже, не попал в ОС python или модуль posix(пока?). Поэтому вызов системной команды 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