2012-11-14 27 views
6

Chociaż patrząc na doc Pythona dla multiprocessing.terminate() natknąłem się na następujący:Mulitprocessing wypowiedzieć i skorumpowanych kolejki

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.

które zasadniczo mówi, że jeśli zakończyć proces, który jest za pomocą kolejki, fajki lub podobny uruchomieniu ryzyko uszkodzenia struktury.

Mam kilka pytań na temat tego,

  1. Co stanie się inny proces próbuje pobrać dane z rury, kolejki lub podobne, jeśli występuje korupcja?
  2. W jaki sposób można sprawdzić proces, aby sprawdzić, czy nie ma korupcji?
  3. Czy zakleszczenie może zostać rozwiązane w jakikolwiek sposób, jeśli wiesz, że inny proces został zakończony?

Rozumiem, zawsze należy starać się nie używać zakończyć, ale to jest dla tej sytuacji, w której nie można zrobić nic innego, ale to

+0

1. Podnosi IOError: [Errno 32] Broken pipe – andrean

Odpowiedz

1

Okay, więc nie było to najmilsze rozwiązanie, ale najpierw poradziłem sobie z wyjątkami najlepiej jak to możliwe. Nie chciałem ryzykować korupcji, więc teraz ponownie uruchamiam aplikację w przypadku, gdy istnieje możliwość wystąpienia korupcji w celu zmniejszenia szansy na ewentualne problemy.

Dzięki @MarwanAlsabbagh za Twoją sugestię.

3

można dodać sumy kontrolnej do bloków danych, które przechodzą wokół i sprawdzić je aby potwierdzić, że nie wystąpiło uszkodzenie danych. Jest to powszechna technika w każdej komunikacji danych, która wiąże się z ryzykiem uszkodzenia danych. Możesz na to spojrzeć pod hashlib i użyć czegoś w rodzaju sum kontrolnych md5 lub crc32.