5 Stimmen

Überwachen Sie feststeckende Python-Prozesse

Ich habe ein Python-Skript, das URL-Anfragen mit urllib2 durchführt. Ich habe einen Pool von 5 Prozessen, die asynchron laufen und eine Funktion ausführen. Diese Funktion ist diejenige, die die URL-Anfragen durchführt, Daten abruft, sie in das erforderliche Format analysiert, Berechnungen durchführt und Daten einfügt. Die Menge der Daten variiert für jede URL-Anfrage.

Ich führe dieses Skript alle 5 Minuten mit einem Cron-Job aus. Manchmal, wenn ich ps -ef | grep python mache, sehe ich festsitzende Prozesse. Gibt es eine Möglichkeit, die Prozesse zu verfolgen, d.h. innerhalb der Multiprocessing-Klasse, die die Prozesse, ihren Zustand - abgeschlossen, festsitzend oder tot - festhalten kann? Hier ist ein Code-Schnipsel:

So rufe ich asynchrone Prozesse auf

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

Und folgendes ist ein Teil von getData, der urllib2-Anfragen durchführt:

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

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

Gibt es eine Möglichkeit, festsitzende Prozesse zu verfolgen und sie erneut auszuführen?

1voto

lericson Punkte 1294

Implementieren Sie einen Ping-Mechanismus, wenn Sie dazu neigen, Multiprocessing zu verwenden. Suchen Sie nach Prozessen, die aufgrund langsamer E/A feststecken, nehme ich an?

Persönlich würde ich mich für eine Warteschlange entscheiden (nicht unbedingt einen Warteschlangen-Server), nehmen wir zum Beispiel an, dass ~/jobs eine Liste von URLs ist, an denen gearbeitet werden soll, dann ein Programm haben, das den ersten Job übernimmt und ausführt. Dann ist es nur eine Frage des Buchungsmanagements - das Programm sollte beispielsweise notieren, wann es gestartet wurde und was seine PID ist. Wenn Sie langsame Jobs beenden müssen, beenden Sie einfach die PID und markieren Sie den Job als fehlgeschlagen.

0voto

guettli Punkte 23426

Google nach urllib2 und Timeout. Wenn das Timeout erreicht wird, erhalten Sie eine Ausnahme, und der Prozess bleibt nicht mehr stecken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X