Montag, Mai 25, 2020

python-multiprocessing-pool, warten Sie, bis die Prozesse und starten Sie benutzerdefinierte Prozesse

Früher habe ich python multiprocessing und tun, warten, dass alle Prozesse mit diesem code:

...
            results = []
            for i in range(num_extract):
                url = queue.get(timeout=5)
                try:
                    print "START PROCESS!"
                    result = pool.apply_async(process, [host,url],callback=callback)
                    results.append(result)
                except Exception,e:

                    continue


            for r in results:
                r.get(timeout=7)
...

ich versuche, mit pool.beitreten, bekomme aber Fehler:

Traceback (most recent call last):
  File "C:\workspace\sdl\lxchg\walker4.py", line 163, in <module>
    pool.join()
  File "C:\Python25\Lib\site-packages\multiprocessing\pool.py", line 338, in joi
n
    assert self._state in (CLOSE, TERMINATE)
AssertionError

Warum treten Sie nicht funktionieren? Und was ist der gute Weg, warten alle Prozesse.

Meine zweite Frage ist, wie kann ich neu starten bestimmter Prozess im pool? ich brauche das im Grund des memory-leak. Nun In der Tat mache ich den Umbau im pool, nachdem alle Prozesse Ihre Aufgaben (erstellen Sie neue Objekt-pool zu tun Prozess-Neustart).

Was ich brauche: ich habe zum Beispiel 4 Verfahren im pool. Dann Prozess, seine Aufgabe nach Aufgabe wird erledigt, ich brauche die Prozess Abbrechen und neu starten (auffrischen memory leak).

  • warum ist multiprocessing/pool.py Leben in site-packages und nicht direkt in Lib? Wenn Sie schon hacken, dann haben wir eine Art wissen müssen.
  • hmm.. ich weiß nicht wie ich es installieren mit dem windows installer… geted von der offiziellen Website..
  • ich habe python2.5
InformationsquelleAutor Evg | 2010-09-10

1 Kommentar

  1. 19

    Sind Sie immer der Fehler, da müssen Sie rufen Sie pool.close() vor dem Aufruf pool.join()

    Ich weiß nicht ein guter Weg, um shut-down-Prozess gestartet, mit apply_async aber sehen, wenn ordnungsgemäß Herunterfahren den pool-nicht Ihren Speicher-Leck Weg.

    Der Grund, warum ich denke, das ist, dass die Pool Klasse hat eine Reihe von Attributen, die threads im daemon-Modus läuft. Alle diese threads bereinigt werden, indem die join Methode. Der code, den Sie jetzt haben, nicht bereinigt werden, so dass, wenn Sie erstellen eine neue Pool, Sie haben noch alle diese Fäden laufen von der letzten.

    • thnx mit schließen, es funktioniert.
    • über pool-ich meine, es scheint, dass die pool-Nutzung-Prozesse Erstellung von Anfang bis Ende. Mein Skript lange Zeit in der Arbeit und mit der Zeit alle Prozesse der pool beginnen zu wachsen, in der Erinnerung, ich will zurücksetzen, um die Speicherauslastung des Prozesses von Zeit zu Zeit (mit jeder neuen Aufgabe, für Verfahren) und Neustarten des Prozesses ist eine Möglichkeit, ich kann es tun.. denke ich
    • sorry, ich meine nicht die memory-leak-ich meine über einfach wächst im Speicher von Prozess-und controlling-diese wächst über Prozess-Neustart.
    • Wenn das neue Verfahren könnte die gleiche Aufgabe wie der alte Prozess, aber mit weniger Speicher, dann es scheint, dass Sie einen Speicherverlust in dem Prozess selbst, anstatt in den pool. Das ist ein separates Problem. Kurz, wenn Sie möchten, um zu überprüfen, um zu sehen, wenn Sie die Erstellung der Zyklen in den Prozessen. Wenn dem so ist, werden Sie sicher, dass Sie del die Mitglieder des Zyklus, wenn Sie mit Ihnen durch, so dass der garbage-collector kann den Speicherplatz freizugeben.
    • ja, es in Prozess übergebenen apply_async, Prozess abrufen von Daten aus dem web ist es erforderlich, verschiedene Speicher für jede Aufgabe das ist, warum ich brauchen, erstellen Sie neuen Prozess(erstellen von Prozess-in-pool) für jede Aufgabe (auch kostenlos memore von prev-task verbraucht). Ich glaube nicht, dass gc kann hilft hier versuche ich, es zu benutzen ein Weg – nicht hilft, brauchen etwas mehr global wie neu alle Aufgaben.
    • andere Worte, die mein pool-start mit 4 Prozessen, die jeweils auf start verbraucht der Nähe 2 mb ram. Nach jedem Prozess tun thausends der Aufgaben wird es graw 100mb. das ist, warum ich brauchen einen Neustart für jede neue Aufgabe.
    • Was Sie beschreiben, ist ein – text-Buch-Beispiel ein Speicher-Leck. Neustarten der Prozesse wird verbergen, aber nicht beheben. Update – das memory-leak in die Prozesse und werden Sie nicht ein problem haben.
    • ich benutze einige frameworks und Leck es kann in Ihnen sein, und ich habe nun mal in diesem moment erkunden Sie den code.. ich brauche eine schnelle Lösung, was du meinst „verstecken“, nicht „beheben“? dann habe ich den Neustart-Prozess, die ich kostenlos alle it-mem und garanty free mem ohne Lecks..ist es nicht?

Kostenlose Online-Tests