Вопрос

Я знаю о 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top