Python multiprocessing mit einer Update-Warteschlange und eine output-queue

Wie kann ich ein Skript, ein Python-Multiprozess-mit zwei Warteschlangen wie diese?:

  1. man als Arbeits-Warteschlange, beginnt mit einigen Daten und, die, je nach den Bedingungen der Funktionen parallelisiert werden, erhält weitere Aufgaben on-the-fly,
  2. anderen, sammelt Ergebnisse und wird verwendet, um zu notieren Sie das Ergebnis nach der Verarbeitung abgeschlossen ist.

Ich im Grunde brauchen, um einige weitere Aufgaben in der aktiven Warteschlange, je nach dem, was ich in seiner ursprünglichen Elemente. Das Beispiel, das ich post unten ist albern (ich verwandeln könnte der Artikel, wie ich Sie gerne und setzen es direkt in die Ausgabe-Warteschlange), aber seine mechanik sind klar und spiegeln Teil des Konzepts, die ich brauche, sich zu entwickeln.

Hiermit mein Versuch:

import multiprocessing as mp

def worker(working_queue, output_queue):
    item = working_queue.get() #I take an item from the working queue
    if item % 2 == 0:
        output_queue.put(item**2) # If I like it, I do something with it and conserve the result.
    else:
        working_queue.put(item+1) # If there is something missing, I do something with it and leave the result in the working queue 

if __name__ == '__main__':
    static_input = range(100)    
    working_q = mp.Queue()
    output_q = mp.Queue()
    for i in static_input:
        working_q.put(i)
    processes = [mp.Process(target=worker,args=(working_q, output_q)) for i in range(mp.cpu_count())] #I am running as many processes as CPU my machine has (is this wise?).
    for proc in processes:
        proc.start()
    for proc in processes:
        proc.join()
    for result in iter(output_q.get, None):
        print result #alternatively, I would like to (c)pickle.dump this, but I am not sure if it is possible.

Dieser nicht zu Ende, noch drucken ohne Ergebnis.

Am Ende des gesamten Prozesses, würde ich mag, um sicherzustellen, dass die Arbeits-Warteschlange leer ist, und dass alle parallelen Funktionen fertig geschrieben haben, um die Ausgabe-Warteschlange vor der später iteriert wird, um die Ergebnisse. Haben Sie Vorschläge, wie man damit es funktioniert?

InformationsquelleAutor Jaqo | 2014-02-06
Schreibe einen Kommentar