2012-10-12 100 views
5

Al sistema operativo no le gustará si usa multiprocesamiento y termina accidentalmente en creating processes without limit.Prevención de multiprocesamiento de "errores de escape"

¿Hay alguna solución simple que evite que esto suceda (por ejemplo, limitando el número total de procesos, ya sea en Python o en el sistema operativo)?

Uso Windows, y se comporta realmente mal (requiere reinicio) cuando cometo un error como ese. Así que me encantaría si hay algún código que pueda incluir/agregar a mi aplicación y evitar que esto suceda.

+0

Si esta es una pregunta de Windows, ¿por qué está etiquetada Linux? – tMC

+0

¡Porque idealmente quiero una solución para Linux y una solución para Windows! Lo siento, no lo tenía claro ... Obviamente, una solución al 50% es mejor que nada. – max

Respuesta

3

Lo que puede hacer es crear un módulo de tipo corto 'trip-wire' e importarlo además de multiprocesamiento. El módulo de cable de disparo generará una excepción si detecta un bucle infinito de multiprocesamiento.

mina se parece a esto:

#mp_guard.py 
"""tracks invocation by creating an environment variable; if that 
variable exists when next called a loop is in progress""" 

import os 

class Brick(Exception): 
    def __init__(self): 
     Exception.__init__(self, "Your machine just narrowly avoided becoming" 
           " a brick!") 

if 'MP_GUARD' in os.environ: 
    raise Brick 

os.environ['MP_GUARD'] = 'active' 

Y en el archivo principal .py:

import mp_guard 
1

En Linux, puede utilizar la llamada de sistema setrlimit(2) (con RLIMIT_NPROC) para limitar el número de procesos (por ejemplo, para evitar fork bombs). Este syscall está interconectado a través del bash ulimit (o zsh limit) incorporado. Python tiene algunos binding a este syscall.

No tengo idea si existe algo similar en Windows.

+1

Por lo que puedo decir, no existe nada para Windows ... es una mierda para ellos :-( – ephemient

+0

Si es así, es una mierda. Incluso cuando Windows entra en modo de apagado, parece que no puede detener la proliferación de procesos. cree que sería fácil para Win 7 bloquear cualquier nuevo proceso creado por el usuario cuando intenta cerrarse ... – max

+1

Linux no sufre este problema. –

1

En las ventanas se pueden crear "un trabajo", no soy un experto en Python, así que no sé si hay algún compromiso para crear trabajos de Windows. La función API de Windows es CreateJobObject. Un objeto de trabajo es (en cierta medida) equivalente de Unix "grupo de procesos". Puede aplicar ciertas limitaciones tanto en el objeto de trabajo en conjunto como en cada proceso por separado (por ejemplo, procesos máximos en el trabajo). Puede crear un objeto de trabajo, asignarle el límite de número de procesos y luego asignar su propio proceso al objeto de trabajo. Lo que puede estar buscando es CreateJobObject, SetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS. De nuevo: esta es la API de Windows, no estoy seguro de si tiene alguna 'vinculación' con python relacionada con estas funciones.