¿Es posible cambiar un subproceso?

Sé que os.nice() funciona perfecto para el proceso de padres, pero necesito hacer un nuevo procesamiento de los subprocesos de mi hijo. Encontré la forma de hacer esto, pero parece no ser muy práctico y demasiado excesivo:

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

Y no se devuelve un buen nivel después de cambiar de posición.

¿Hay una forma más limpia de cambiar los subprocesos en python?

Utilice el parámetro preexec_fn de subprocess.Popen :

Si preexec_fn se establece en un objeto invocable, este objeto se llamará en el proceso hijo justo antes de que se ejecute el hijo. (Unix solamente)

Ejemplo:

 >>> 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) 

Debe usar subprocess.Popen lugar de os.system , para que pueda acceder a cualquier resultado impreso en sys.stdout. IIRC, os.system solo le da acceso al valor de retorno, que probablemente sea ‘0’ y no el nivel os.system .

Por lo general, renice se implementa mediante set / getpriority , que no parece haber ingresado en el módulo Python OS o Posix (¿todavía?). Así que llamar al comando del sistema Renice parece ser tu mejor apuesta ahora.

Como alternativa, podría hacer un llamamiento a los padres antes de crear un proceso hijo, que heredará el buen valor de los padres, y volver a utilizarlo después de haber creado el proceso hijo.

Sin los derechos adecuados, solo se puede cambiar de una manera.

Creé un script de Python con un CLI en el pasado. Puede encontrarlo aquí: https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

Por lo general, renice se implementa mediante set / getpriority, que no parece haber ingresado en el módulo Python OS o Posix (¿todavía?). Así que llamar al comando del sistema Renice parece ser tu mejor apuesta ahora.

Expandiendo el comentario de Daniel sobre los 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)) 

Resultado:

 old priority for PID 9721 is 0 new priority for PID 9721 is 19