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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top