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