2012-10-12 13 views
5

Il sistema operativo non piacerà se si usa il multiprocesso e si finisce accidentalmente con lo creating processes without limit.Prevenire il multiprocessing "bugs in fuga"

C'è una soluzione semplice che impedisce che ciò accada (ad esempio, limitando il numero totale di processi, in Python o nel sistema operativo)?

Io uso Windows e si comporta veramente male (richiede un riavvio) quando commetto un errore del genere. Quindi mi piacerebbe se ci fosse del codice che posso avvolgere/aggiungere alla mia applicazione e impedire che ciò accada.

+0

Se questa è una domanda di Windows, perché è codificata in Linux? – tMC

+0

Perché idealmente voglio una soluzione per Linux e una soluzione per Windows! Mi spiace di non essere stato chiaro a riguardo ... Ovviamente una soluzione del 50% è ancora meglio di niente. – max

risposta

3

Ciò che si può fare è creare un modulo di tipo "trip-wire" e importarlo, nonché multiprocessing. Il modulo trip-wire solleverà un'eccezione se rileva un loop infinito di multiprocessing.

miniera di simile a questa:

#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' 

E nel file .py principale:

import mp_guard 
1

Su Linux, è possibile utilizzare il syscall setrlimit(2) (con RLIMIT_NPROC) per limitare il numero di processi (ad esempio per evitare fork bombs). Questo syscall è interfacciato tramite la bash ulimit (o zsh limit) integrata. Python ha qualche binding in questo syscall.

Non ho idea se qualcosa di simile esiste sotto Windows.

+1

Per quanto ne so, non esiste nulla per Windows ... fa schifo a loro :-( – ephemient

+0

Se è così, fa davvero schifo: anche quando Windows entra in modalità di spegnimento, sembra impossibile arrestare la proliferazione dei processi. pensa che sarebbe facile per Win 7 bloccare qualsiasi nuovo processo creato dall'utente quando sta provando a chiudere ... – max

+1

Linux non soffre di questo problema. –

1

Su Windows è possibile creare "un lavoro", io non sono un esperto in pitone, quindi non so se ci sia alcun legame per la creazione di lavori di Windows. La funzione API di Windows è CreateJobObject. Un oggetto lavoro è (in qualche misura) equivalente al "gruppo di processi" di Unix. È possibile applicare alcune limitazioni sia sull'oggetto di lavoro nel suo complesso che a ciascun processo separatamente (ad esempio, i processi massimi nel processo). È possibile creare un oggetto lavoro, assegnare un numero di limiti di processi e quindi assegnare il proprio processo all'oggetto lavoro. Che cosa si può essere alla ricerca di è CreateJobObject, SetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS. Ancora una volta: questa è l'API di Windows, non sono sicuro che tu abbia qualche "binding" per Python relativo a queste funzioni.