2012-11-14 19 views
6

Mentre guardando il doc python per multiprocessing.terminate() mi sono imbattuto il seguente:Mulitprocessing, terminare e le code corrotti

Terminate() If this method is used when the associated process is using a pipe or queue then the pipe or queue is liable to become corrupted and may become unusable by other process. Similarly, if the process has acquired a lock or semaphore etc. then terminating it is liable to cause other processes to deadlock.

che dice in sostanza se si termina un processo che utilizza una coda, tubo o simile si esegue il rischio che la struttura si corrompa.

Ho un paio di domande su questo,

  1. Che ne sarà di un altro processo cercando di recuperare i dati dal tubo, coda o simili in caso di corruzione?
  2. Come può un processo verificare se c'è corruzione?
  3. Il deadlock può essere risolto in qualsiasi modo se si conosce un altro processo è stato terminato?

ho capito che si dovrebbe sempre cercare di non utilizzare per terminare, ma questo è per quella situazione in cui non si può fare altro che questo

+0

1. Solleva IOError: [Errno 32] Tubo rotto – andrean

risposta

1

Ok, quindi non è stata la soluzione migliore ma ho gestito le eccezioni il prima possibile. Non volevo correre il rischio di corruzione, quindi ora riavvio l'applicazione in un'istanza in cui è possibile che si verifichi una corruzione per ridurre la possibilità di possibili problemi.

Grazie a @MarwanAlsabbagh per il vostro suggerimento.

3

si potrebbe aggiungere checksum per i blocchi di dati che si passa in giro e li controlla per confermare che non si è verificata corruzione dei dati. Questa è una tecnica comune in qualsiasi comunicazione di dati che presenta un rischio di corruzione dei dati. Per questo puoi guardare a hashlib e usare qualcosa come checksum md5 o crc32.