2010-03-17 29 views
7

So di os.nice() funziona perfettamente per il processo padre, ma ho bisogno di fare il renice dei sottoprocessi di mio figlio. Ho trovato modo per fare questo, ma sembra non essere molto pratico e troppo eccessivo:È possibile modificare un sottoprocesso?

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

E non è ottenere un rendimento conseguente livello bello dopo renicing.

C'è un modo più semplice di renizzare i sottoprocessi in python?

risposta

11

utilizzare il parametro preexec_fn di subprocess.Popen:

Se preexec_fn è impostata su un oggetto invocabile, questo oggetto sarà chiamato nel processo figlio appena prima che il bambino venga giustiziato. (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) 
2

È necessario utilizzare subprocess.Popen anziché os.system, in modo da poter accedere ai risultati stampati su sys.stdout. IIRC, os.system fornisce solo l'accesso al valore restituito, che è probabilmente '0' e non il livello piacevole.

2

renice viene in genere implementato dal set/getpriority, che non sembra averlo inserito nel modulo os o pos python (ancora?). Quindi chiamare il comando del sistema di renice sembra la soluzione migliore ora.

In alternativa, si potrebbe os.nice il genitore prima di creare un processo figlio - che erediterà il valore piacevole dei suoi genitori - e os.nice nuovamente dopo aver creato il processo figlio.

+2

poteva chiamare setpriority/getpriority utilizzando ctypes. –

1

senza averne diritto è possibile Renice in un solo modo

0

renice di solito è implementato dal set/getpriority, che non sembra di averlo fatto nell'OS pitone o modulo POSIX (ancora?). Quindi chiamare il comando del sistema di renice sembra la soluzione migliore ora.

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 
Problemi correlati