2009-06-21 69 views

Respuesta

29

Esta es la solución que estoy usando para establecer mi proceso de prioridad inferior a lo normal:

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) 

probado en Python 2.6 en Windows y Linux.

+1

buena solución, pero ¿por qué llamas sys.getwindowversion() en lugar de comprobar sys.platform? –

+1

Solo quiero saber confiablemente si estoy corriendo en Windows o no. 'sys.platform' [tiene valores de devolución documentados] (http://docs.python.org/library/sys.html#sys.platform) pero no estaba seguro de si era confiable, ¿realmente regresa' 'win32'' en Windows de 64 bits? (Créalo o no, todavía no tengo un Windows de 64 bits para probarlo! Supongo que debería poder trabajar ahora) –

+3

Probado en Win7 64 bits (con Python 64 bits): 'sys.platform' de hecho devuelve ''win32'' – Jonathan

9

en todas las plataformas Unix (incluyendo Linux y MacOSX), ver os.nicehere:

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

Puesto que usted ya tiene una receta para Windows, que cubre la mayoría de las plataformas - llamar os.nice con un resultado positivo argumento en todas partes menos en Windows, use esa receta allí. No existe una solución multiplataforma "muy bien empaquetada" AFAIK (sería difícil empaquetar este combo, pero, ¿cuánto valor adicional vería al empaquetarlo? -)

13

Puede usar el módulo psutil.

En las plataformas POSIX:

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

En Windows:

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

Gracias por el enlace. Es una pena que la API sea diferente en las dos plataformas ('10' contra' psutil.HIGH_PRIORITY_CLASS'). "Plataforma cruzada" significa "la misma API en todas las plataformas", debería pensar. –

+0

psutil.HIGH_PRIORITY_CLASS es solo una constante entera que es necesaria porque la prioridad del proceso en Windows funciona de manera diferente que en UNIX: http://msdn.microsoft.com/en-us/library/ms683211(v=vs.85).aspx Dejando eso de lado, podemos considerar el uso multiplataforma de psutil en el sentido de que le permite usar: p.nice = algún_número ... para establecer la prioridad del proceso tanto en UNIX como en Windows. La única diferencia es que en Windows some_number se guarda en una constante predefinida. Eso es todo. –

+1

Es una pena que la comunidad de Python haga esto con la portabilidad. Su definición de "portátil" es "implementaremos cualquier cosa que el sistema operativo nos permita hacer fácilmente". ¿Por qué no se puede seleccionar() trabajar en las tuberías en Windows? Es factible, pero el sistema operativo no lo hace por usted, por lo que no está implementado. Python es portátil siempre que nunca necesites ninguna biblioteca, lo que nunca ocurre. – user1594322

Cuestiones relacionadas