Pregunta

os.nice() funciona perfecto para los padres proceso, pero tengo que hacer renice de subprocesos mi hijo. He encontrado manera 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 es obtener un rendimiento resultante nivel agradable después de renicing.

¿Hay forma más limpia para renice subprocesos en Python?

¿Fue útil?

Solución

Utilice el parámetro preexec_fn de subprocess.Popen :

  

Si preexec_fn se establece en un objeto puede ser llamado, este objeto será llamado en el proceso hijo justo antes de que se ejecute el niño. (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)

Otros consejos

Debe utilizar subprocess.Popen en lugar de os.system, para que pueda acceder a los resultados impresos a sys.stdout. IIRC, os.system sólo se le da acceso al valor de retorno, que es, probablemente, '0' y no el nivel agradable.

renice se implementa normalmente por set / getpriority , que doesn 't parecen haber logrado entrar en el sistema operativo de pitón o módulo POSIX (¿todavía?). Así llamando al comando del sistema renice parece que la mejor opción ahora.

Como alternativa, se podría os.nice los padres antes de crear un proceso hijo - el cual heredará sus padres buen valor -. Os.nice y de nuevo después de haber creado el proceso hijo

sin derechos adecuados puede renice sólo en una forma

He creado un script en Python con un CLI en el pasado. Lo puedes encontrar aquí: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

  

renice se implementa normalmente por set / getpriority, lo que no parece haber logrado entrar en el sistema operativo de pitón o módulo POSIX (¿todavía?). Así llamando al comando del sistema renice parece que la mejor opción ahora.

La expansión comentario de Daniel acerca de 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))

Resultados:

old priority for PID 9721 is 0
new priority for PID 9721 is 19
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top