Frage

Ich weiß, über os.nice() funktioniert es perfekt für Eltern verarbeiten, aber ich brauche renice mein Kind Subprozesse zu tun. Ich fand Weg, dies zu tun, aber es scheint zu sein, nicht sehr praktisch und zu übertrieben:

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

Und es ist nicht zurück schönes berechnetes Niveau nach renicing.

Gibt es mehr saubere Art und Weise Subprozesse in Python renice?

War es hilfreich?

Lösung

Mit dem preexec_fn Parameter von subprocess.Popen :

  

Wenn preexec_fn auf ein aufrufbare Objekt gesetzt ist, so wird dieses Objekt in dem Child-Prozess aufgerufen werden, kurz bevor das Kind ausgeführt wird. (Nur Unix)

Beispiel:

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

Andere Tipps

Sie sollten subprocess.Popen anstelle von os.system, so dass Sie alle Ergebnisse zu sys.stdout gedruckt zugreifen können. IIRC, os.system gibt Sie nur auf den Rückgabewert zugreifen, was wahrscheinlich ist ‚0‘ und nicht das schöne Niveau.

renice wird in der Regel durch den Satz implementiert / getpriority , die doesn ‚t scheint, um es in das python-o oder Posix-Moduls (noch?). So ruft den Befehl renice System wie Ihre beste Wette scheint jetzt.

Als Alternative könnten Sie die Eltern os.nice, bevor Sie ein Kind-Prozess schaffen - was seine Eltern schön Wert erben -. Und os.nice wieder zurück, nachdem Sie das Kind Prozess erstellt haben

ohne entsprechende Rechte können Sie nur auf eine Weise renice

Ich habe einen Python-Skript mit einer CLI in der Vergangenheit. Sie können es hier finden: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

  

ist renice in der Regel durch setzen / getpriority implementiert, die offenbar nicht in die Python-os gemacht zu haben oder Posix-Modul (noch?). So ruft den Befehl renice System wie Ihre beste Wette scheint jetzt.

Der Ausbau Daniel Kommentar über 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))

Ergebnis:

old priority for PID 9721 is 0
new priority for PID 9721 is 19
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top