2009-06-21 6 views

Répondre

29

Voici la solution que j'utilise pour mettre mon processus à priorité inférieure à la normale:

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) 

testé sur Python 2.6 sous Windows et Linux.

+1

solution Nice, mais pourquoi appelez-vous sys.getwindowversion() au lieu de vérifier sys.platform? –

+1

Je veux juste savoir de manière fiable si je cours sous Windows ou non. 'sys.platform' [possède des valeurs de retour documentées] (http://docs.python.org/library/sys.html#sys.platform) mais je ne savais pas si c'était digne de confiance - est-ce vraiment le cas? 'win32' sur Windows 64 bits? (croyez-le ou non, je n'ai toujours pas de Windows 64 bits pour l'essayer! Je suppose que je devrais pouvoir travailler maintenant) –

+3

Essayé sur Win7 64bit (avec Python 64bit): 'sys.platform' en effet renvoie «win32» – Jonathan

9

Sur toutes les plateformes Unix (y compris Linux et MacOSX), voir os.nicehere:

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

Puisque vous avez déjà une recette pour Windows, qui couvre la plupart des plates-formes - avec un appel os.nice positif argument partout sauf Windows, utilisez cette recette là. Il n'y a pas de solution multiplate-forme «joliment emballée» AFAIK (serait difficile d'emballer ce combo, mais, quelle valeur supplémentaire verriez-vous en l'emballant simplement?)

13

Vous pouvez utiliser le module psutil.

Sur les plates-formes POSIX:

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

Sous Windows:

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

Merci pour le lien. Il est dommage que l'API soit différente sur les deux plateformes ('10' versus' psutil.HIGH_PRIORITY_CLASS'). "Cross platform" signifie "la même API sur toutes les plateformes", je devrais penser. –

+0

psutil.HIGH_PRIORITY_CLASS est juste une constante entière qui est nécessaire car la priorité du processus sous Windows fonctionne différemment de celle d'UNIX: http://msdn.microsoft.com/en-us/library/ms683211(v=vs.85).aspx Cela mis à part, nous pouvons considérer psutil multiplateforme en ce qu'il vous permet d'utiliser: p.nice = some_number ... pour la priorité de processus sur UNIX et Windows. La seule différence est que Windows sur some_number est enregistré dans une constante prédéfinie. C'est tout. –

+1

Dommage que la communauté Python le fasse avec la portabilité. Leur définition de "portable" est "nous allons implémenter tout ce que l'OS nous permet de faire facilement". Pourquoi ne peut-on pas sélectionner() travailler sur des tuyaux sous Windows? C'est faisable, mais le système d'exploitation ne le fait pas pour vous, donc il n'est pas implémenté. Python est portable tant que vous n'avez jamais besoin de bibliothèques, ce qui n'est jamais le cas. – user1594322

Questions connexes