Est-il possible de renice un sous-processus?
-
20-09-2019 - |
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?
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