Question

Je sais os.nice() il fonctionne parfaitement pour les parents processus, mais je dois faire renice de mes sous-processus de l'enfant. J'ai trouvé moyen de le faire, mais il ne semble pas être très pratique et trop excessive:

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

Et il est retourne pas obtenu bon niveau après renicing.

Y at-il de façon plus propre à renice en python sous-processus?

Était-ce utile?

La solution

Le paramètre preexec_fn de subprocess.Popen :

  

Si preexec_fn est réglé sur un objet appelable, cet objet sera appelé dans le processus de l'enfant juste avant que l'enfant est exécuté. (Unix seulement)

Exemple:

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

Autres conseils

Vous devez utiliser subprocess.Popen au lieu de os.system, afin que vous puissiez accéder à tous les résultats imprimés à sys.stdout. IIRC, os.system ne vous donne accès à la valeur de retour, ce qui est probablement « 0 » et non le bon niveau.

renice est généralement mis en œuvre par ensemble / getpriority qui doesn « t semblent avoir fait dans l'os de python ou le module posix (encore?). Donc, appeler la commande du système renice semble que votre meilleur pari maintenant.

Comme alternative, vous pourriez os.nice le parent avant de créer un processus enfant - qui héritera ses parents, belle valeur -. Et os.nice à nouveau après avoir créé le processus enfant

sans droits appropriés, vous pouvez renice que dans un sens

J'ai créé un script python avec une CLI dans le passé. Vous pouvez le trouver ici: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

  

renice est généralement mis en œuvre par ensemble / getpriority, qui ne semble pas avoir fait dans l'os de python ou le module posix (encore?). Donc, appeler la commande du système renice semble que votre meilleur pari maintenant.

Élargir le commentaire de Daniel à propos 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))

Résultat:

old priority for PID 9721 is 0
new priority for PID 9721 is 19
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top