E 'possibile renice un sottoprocesso?
-
20-09-2019 - |
Domanda
os.nice()
funziona perfetto per genitori processo, ma ho bisogno di fare renice dei miei sottoprocessi bambino. Ho trovato modo per fare questo, ma sembra non essere molto pratico e troppo eccessivo:
os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )
E non è tornare con conseguente livello di bello dopo renicing.
C'è modo più pulito per renice sottoprocessi in Python?
Soluzione
Utilizzare il parametro preexec_fn
di subprocess.Popen
:
Se
preexec_fn
è impostato su un oggetto invocabile, questo oggetto sarà chiamato nel processo figlio poco prima dell'esecuzione del bambino. (Solo Unix)
Esempio:
>>> 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)
Altri suggerimenti
Si dovrebbe usare subprocess.Popen
invece di os.system
, in modo da poter accedere a tutti i risultati di stampa a sys.stdout. IIRC, os.system
dà solo accesso al valore di ritorno, che è probabilmente '0' e non il livello piacevole.
renice di solito è implementato dal set / getpriority , che doesn 't sembrano aver fatto nell'OS pitone o modulo POSIX (ancora?). Quindi chiamare il comando di sistema renice sembra la soluzione migliore ora.
In alternativa, si potrebbe os.nice il genitore prima di creare un processo figlio - che erediterà i suoi genitori valore nice -. E os.nice di nuovo dopo aver creato il processo figlio
senza averne diritto è possibile renice in un solo modo
ho creato uno script python con una CLI in passato. Lo si può trovare qui: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py
renice di solito è implementato dal set / getpriority, che non sembra di averlo fatto nell'OS pitone o modulo POSIX (ancora?). Quindi chiamare il comando di sistema renice sembra la soluzione migliore ora.
L'espansione commento di Daniel su 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))
Risultato:
old priority for PID 9721 is 0
new priority for PID 9721 is 19