Ich habe versucht, die Dokumentation unter http://docs.python.org/dev/library/multiprocessing.html zu lesen , habe aber immer noch Probleme mit der Mehrfachverarbeitung von Warteschlange, Pool und Sperre. Und jetzt konnte ich das folgende Beispiel erstellen.
In Bezug auf Warteschlange und Pool bin ich mir nicht sicher, ob ich das Konzept richtig verstanden habe. Korrigieren Sie mich also, wenn ich falsch liege. Was ich erreichen möchte, ist, 2 Anfragen gleichzeitig zu verarbeiten (Datenliste hat 8 in diesem Beispiel). Was soll ich also verwenden? Pool zum Erstellen von 2 Prozessen, die zwei verschiedene Warteschlangen verarbeiten können (maximal 2), oder sollte ich Queue verwenden, um jedes Mal 2 Eingaben zu verarbeiten? Die Sperre wäre, die Ausgaben korrekt zu drucken.
import multiprocessing
import time
data = (['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
)
def mp_handler(var1):
for indata in var1:
p = multiprocessing.Process(target=mp_worker, args=(indata[0], indata[1]))
p.start()
def mp_worker(inputs, the_time):
print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
time.sleep(int(the_time))
print " Process %s\tDONE" % inputs
if __name__ == '__main__':
mp_handler(data)
quelle
var1
alles entfernt und michdata
stattdessen auf global bezogen .Dies hängt möglicherweise nicht zu 100% mit der Frage zusammen, aber bei meiner Suche nach einem Beispiel für die Verwendung von Multiprocessing mit einer Warteschlange wird dies zuerst bei Google angezeigt.
Dies ist eine grundlegende Beispielklasse, mit der Sie Elemente instanziieren und in eine Warteschlange stellen und warten können, bis die Warteschlange beendet ist. Das ist alles was ich brauchte.
quelle
item1
unditem2
? Handelt es sich um eine Aufgabe oder Funktionen, die in zwei verschiedenen Prozessen ausgeführt werden?Hier ist mein persönlicher Beitrag zu diesem Thema:
Gist hier (Pull-Anfragen willkommen!): Https://gist.github.com/thorsummoner/b5b1dfcff7e7fdd334ec
quelle
get()
eine Zeitüberschreitung hat nichts mit der Anzahl der gestarteten Jobs zu tun..get(timeout=1)
? und ist es okay zu sagen.get()
, um die fertige Liste zu bekommen?.get()
wartet auf unbestimmte Zeit, bis alle Ergebnisse verfügbar sind, und gibt die Ergebnisliste zurück. Sie können eine Abfrageschleife verwenden, um zu überprüfen, ob Wetterergebnisse verfügbar sind, oder Sie können eine Rückruffunktion immap_async()
Anruf übergeben, die dann für jedes Ergebnis aufgerufen wird, sobald es verfügbar ist.Für alle, die Editoren wie Komodo Edit (win10) verwenden, fügen Sie Folgendes hinzu
sys.stdout.flush()
:oder als erste Zeile an:
Auf diese Weise können Sie sehen, was während der Ausführung des Skripts geschieht. anstatt auf das schwarze Kommandozeilenfeld schauen zu müssen.
quelle
Hier ist ein Beispiel aus meinem Code (für Thread-Pool, aber ändern Sie einfach den Klassennamen und Sie haben einen Prozesspool):
Grundsätzlich:
pool = ThreadPoolExecutor(6)
Erstellt einen Pool für 6 Threadspool.submit(execute_run, rp)
Fügt dem Pool eine Aufgabe hinzu. Das erste arogument ist eine Funktion, die in einem Thread / Prozess aufgerufen wird. Die restlichen Argumente werden an die aufgerufene Funktion übergeben.pool.join
wartet, bis alle Aufgaben erledigt sind.quelle
concurrent.futures
, aber das OP fragt nachmultiprocessing
und Python 2.7.