2009-06-21 7 views

Antwort

29

Hier ist die Lösung, die ich verwende gesetzt meinen Prozess unter normaler Priorität:

lowpriority.py

def lowpriority(): 
    """ Set the priority of the process to below-normal.""" 

    import sys 
    try: 
     sys.getwindowsversion() 
    except AttributeError: 
     isWindows = False 
    else: 
     isWindows = True 

    if isWindows: 
     # Based on: 
     # "Recipe 496767: Set Process Priority In Windows" on ActiveState 
     # http://code.activestate.com/recipes/496767/ 
     import win32api,win32process,win32con 

     pid = win32api.GetCurrentProcessId() 
     handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid) 
     win32process.SetPriorityClass(handle, win32process.BELOW_NORMAL_PRIORITY_CLASS) 
    else: 
     import os 

     os.nice(1) 

getestet auf Python 2.6 unter Windows und Linux.

+1

Nizza Lösung, aber warum nennst du sys.getwindowversion() statt sys.platform zu prüfen? –

+1

Ich möchte nur zuverlässig wissen, ob ich unter Windows laufe oder nicht. 'sys.platform' [hat dokumentierte Rückgabewerte] (http://docs.python.org/library/sys.html#sys.platform), aber ich war mir nicht sicher, ob es vertrauenswürdig war - kommt es wirklich zurück?' "Win32" auf 64-Bit-Windows? (Ob Sie es glauben oder nicht, ich habe immer noch kein 64-Bit-Windows, um es auszuprobieren! Ich denke, ich sollte jetzt in der Lage sein) –

+3

Versucht auf Win7 64bit (mit Python 64bit): 'sys.platform' tatsächlich gibt 'win32'' zurück – Jonathan

9

Auf jeder Unix-ähnliche Plattform (einschließlich Linux und MacOSX), siehe os.nicehere:

os.nice(increment) 
Add increment to the process’s “niceness”. Return the new niceness. Availability: Unix. 

Da Sie bereits ein Rezept für Windows, die die meisten Plattformen abdeckt - os.nice mit einem positiven nennen Argument überall außer Windows, benutze das Rezept dort. Es gibt keine "schön verpackte" Cross-Plattform-Lösung AFAIK (wäre es schwer, diese Combo zu verpacken, aber wie viel zusätzlichen Wert würden Sie nur sehen, wenn Sie es verpacken?)

13

Sie können psutil Modul verwenden.

Auf POSIX-Plattformen:

>>> import psutil, os 
>>> p = psutil.Process(os.getpid()) 
>>> p.nice() 
0 
>>> p.nice(10) # set 
>>> p.nice() 
10 

Unter Windows:

>>> p.nice(psutil.HIGH_PRIORITY_CLASS) 
+4

Danke für den Link. Es ist schade, dass die API auf den beiden Plattformen anders ist ('10' gegenüber' psutil.HIGH_PRIORITY_CLASS'). "Cross-Plattform" bedeutet "die gleiche API auf allen Plattformen", sollte ich denken. –

+0

psutil.HIGH_PRIORITY_CLASS ist nur eine Ganzzahlkonstante, die benötigt wird, weil die Prozesspriorität unter Windows anders funktioniert als unter UNIX: http://msdn.microsoft.com/en-us/library/ms683211(v=vs.85).aspx Davon abgesehen können wir plsutil Cross-Plattform in Betracht ziehen, dass Sie verwenden können: p.nice = eine Nummer ... für die Einstellung der Prozesspriorität unter UNIX und Windows. Der einzige Unterschied ist, dass unter Windows eine Nummer in einer vordefinierten Konstante gespeichert wird. Das ist alles. –

+1

Es ist eine Schande, dass Python-Community dies mit Portabilität tut. Ihre Definition von "portabel" ist "wir werden implementieren, was das OS uns leicht machen lässt". Warum kann() nicht an Pipes in Windows arbeiten? Es ist machbar, aber das Betriebssystem tut es nicht für Sie, also ist es nicht implementiert. Python ist portabel, solange Sie keine Bibliotheken benötigen, was praktisch nie der Fall ist. – user1594322

Verwandte Themen