Возможно ли переименовать подпроцесс?

Я знаю, о 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.приятно снова после создания дочернего процесса.


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


Я создал скрипт 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