2011-08-11 11 views
5

Mam skrypt Pythona, który wykonuje żądania URL przy użyciu urllib2. Mam pulę 5 procesów, które działają asynchronicznie i wykonują funkcję. Ta funkcja umożliwia wywoływanie adresów URL, pobieranie danych, przetwarzanie ich w wymagany format, wykonywanie obliczeń i wstawianie danych. Ilość danych jest różna dla każdego żądania adresu URL.Monitor zatrzymał procesy pythonowe

Uruchamiam ten skrypt co 5 minut przy użyciu zadania cron. Czasami, gdy robię ps -ef | grep python, widzę zablokowane procesy. Czy istnieje sposób, w którym mogę śledzić procesy w klasie wieloprocesowej, które mogą śledzić procesy, ich znaczenie stanu zakończone, zablokowane lub martwe itd.? Oto fragment kodu:

tak właśnie nazywamy asynchroniczny przetwarza

pool = Pool(processes=5) 
pool.apply_async(getData,) 

I po to część getData który wykonuje urllib2 wnioski:

try: 
    Url = "http://gotodatasite.com" 

    data = urllib2.urlopen(Url).read().split('\n') 
except URLError, e: 
    print "Error:",e.code 
    print e.reason 
    sys.exit(0) 

Czy istnieje sposób, aby śledzić zatrzymał procesy i ponownie je uruchomił?

+1

"utknął?" czy możesz wyjaśnić, co to oznacza? –

+0

Dlaczego musisz uruchamiać je z 'multiproccesing'? Co jest złego w korzystaniu z wielu zadań cron? –

+0

@Andrew: przez utknięcie mam na myśli zawieszone procesy. – ash

Odpowiedz

1

Zaimplementuj mechanizm pingowania, jeśli jesteś skłonny do wieloprocesowości. Szukasz procesów, które utknęły z powodu wolnego I/O, jak zakładam?

Osobiście pójdę z kolejki (niekoniecznie serwerze kolejka), powiedzmy na przykład ~/jobs jest lista adresów do pracy, a następnie mieć program, który zajmuje pierwsze zadanie i wykonuje je. To tylko kwestia księgowości - powiedzmy, że masz notatkę programową, kiedy została uruchomiona i jaki jest jej PID. Jeśli chcesz zabić wolne zadania, po prostu zabij PID i oznacz pracę jako nieudaną.

0

Google dla adresu urllib2 i limitu czasu. Jeśli limit czasu zostanie osiągnięty, otrzymasz wyjątek, a proces nie zostanie już zatrzymany.