Можно ли арендовать подпроцесс? - PullRequest
9 голосов
/ 17 марта 2010

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

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

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

Есть ли более чистый способ перекомпоновки подпроцессов в python?

Ответы [ 6 ]

13 голосов
/ 18 марта 2010

Используйте параметр 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)
2 голосов
/ 17 марта 2010

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

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

2 голосов
/ 17 марта 2010

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

1 голос
/ 17 марта 2010

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

0 голосов
/ 01 декабря 2017

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

Расширение комментария Даниила о 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
0 голосов
/ 17 ноября 2011

Я создал скрипт на Python с CLI в прошлом. Вы можете найти его здесь: https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

...