Die Besetzung einer Warteschlange und Verwaltung von multiprocessing python
Bin ich mit diesem problem in python:
- Ich habe eine Warteschlange von URLs, die ich brauche, um zu überprüfen, von Zeit zu Zeit
- wenn die Warteschlange voll ist, ich brauche, um Verfahren jedes Element in der queue
- Jedes Element in der Warteschlange verarbeitet werden müssen, von einem einzigen Prozess (multiprocessing)
Bisher habe ich es geschafft, dies zu erreichen "manuell" wie folgt:
while 1:
self.updateQueue()
while not self.mainUrlQueue.empty():
domain = self.mainUrlQueue.get()
# if we didn't launched any process yet, we need to do so
if len(self.jobs) < maxprocess:
self.startJob(domain)
#time.sleep(1)
else:
# If we already have process started we need to clear the old process in our pool and start new ones
jobdone = 0
# We circle through each of the process, until we find one free ; only then leave the loop
while jobdone == 0:
for p in self.jobs :
#print "entering loop"
# if the process finished
if not p.is_alive() and jobdone == 0:
#print str(p.pid) + " job dead, starting new one"
self.jobs.remove(p)
self.startJob(domain)
jobdone = 1
Aber das führt zu Tonnen von Problemen und Fehlern. Ich fragte mich, ob ich nicht besser geeignet, die mit einem Pool von Prozess. Was wäre der richtige Weg, dies zu tun?
Jedoch eine Menge Zeit, meine queue ist leer und kann gefüllt werden, indem 300 items in eine zweite, so bin ich mir auch nicht sicher, wie die Dinge zu tun hier.
InformationsquelleAutor Tibo | 2013-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mit der Blockung von
queue
, um zu laichen mehrere process at startup (mitmultiprocessing.Pool
) und lassen Sie Sie schlafen, bis einige Daten sind verfügbar in der Warteschlange zu verarbeiten. Wenn Ihr nicht vertraut mit dieser, könnten Sie versuchen, "spielen" mit diesem einfachen Programm:Getestet mit Python 2.7.3 unter Linux
Diese spawnen 3 Prozesse (neben der Eltern-Prozess). Jedes Kind führt die
worker_main
Funktion. Es ist eine einfache Schleife immer ein neues Element aus der Warteschlange, die bei jeder iteration. Arbeitnehmer blockiert werden, wenn nichts bereit ist zu verarbeiten.Beim Start alle 3-Prozess wird schlafen, bis die queue eingespeist, mit einigen Daten. Wenn Daten verfügbar sind, wird einer der wartenden Arbeiter erhalten das Element und beginnt, Sie zu verarbeiten. Danach wird versucht ein anderes Element aus der Warteschlange wieder, wenn nichts verfügbar ist...
Ich bin auch daran interessiert, wie man dieses Stück code arbeiten. Wenn ich es laufen wie es ist, dann läuft es, aber es druckt nichts, wahrscheinlich, weil die worker_main nicht, Daten zu empfangen. Aber wenn ich den pass the_queue als Dritten parameter hab ich TypeError: worker_main () - argument nach dem * muss ein Folge, nicht die Warteschlange
Sie haben wahrscheinlich vergessen das Koma, in
(queue,)
. Ich habe bearbeitet den code und fügen Sie einen Kommentar darauf hingewiesen, dass mögliche Fehlerquelle.Vielen Dank, das war ein problem und die zweite war, ich habe es direkt aus Sublime Text2, die aus irgendeinem Grund nicht gedruckt, aus der Ausgabe-Prozesse. Wenn ich den code ausführen von der Kommandozeile aus, dann funktionierte es gut.
InformationsquelleAutor Sylvain Leroux