Teilen sich eine variable zwischen Prozessen
Ich habe einen downloader-Funktion, die downloads von mehreren Dateien parallel.
Ich benutze multiprocessing.Pool.map_async
zum download der verschiedenen Teile der gleichen Datei.
Ich möchte eine statusbar das download. Für diese, die ich brauche, um zu wissen, die Gesamtanzahl der bytes, die bereits heruntergeladen (total_bytes_dl
).
pool = multiprocessing.Pool(processes)
mapObj = pool.map_async(f, args)
while not mapObj.ready():
status = r"%.2f MB /%.2f MB" % (total_bytes_dl / 1024.0 / 1024.0, filesize / 1024.0 / 1024.0,)
status = status + chr(8)*(len(status)+1)
print status,
time.sleep(0.5)
Ist es ein Weg, um eine variable zu setzen, die freigegeben werden all diese Prozesse UND die wichtigsten Prozess, so dass jeder Prozess Anhängen können, die Menge der bytes, die gerade heruntergeladen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
War die Lösung intilize den neuen Prozess und übergibt die gemeinsame ctypes-Wert:
Verwenden Sie ein Queue-Objekt zugewiesen, wie diese:
Übergeben Sie diese variable an die Arbeitnehmer, und Sie können
que.put(bytes)
zuin regelmäßigen Abständen berichten, wie viel Sie heruntergeladen haben, seit Ihrem letzten Bericht. Sie
dann prüfen Sie einfach die Größe der Warteschlange und ziehen Sie alle eingehenden Berichte:
Hinweis: Obwohl das Modul bietet auch eine Methode
multiprocessing.Queue()
ist es nicht ganz äquivalent zumultiprocessing.Manager().Queue()
. Sehen diese Frage, und die Antwort.Sicher, Sie können freigegebene
ctypes
Werte im shared memory, wenn Sie wollen einfach nur bytes, die heruntergeladen werden soll. übergeben Sie den entsprechenden Wert für jeden einzelnen Arbeitnehmer, und der aufrufende Prozess wird Zugriff darauf haben.finden Sie unter:
http://docs.python.org/library/multiprocessing.html#shared-ctypes-objects
RuntimeError: Synchronized objects should only be shared between processes through inheritance
Könnte man eine Multiprozess-Queue-Objekt, das die Arbeiter konnten zum senden von status-Daten auf. Ihre wichtigste Prozess zum Lesen der status-Einträge aus der Warteschlange und aktualisiert den status entsprechend.