2012-10-16 8 views
9

Ich habe sehr einfache Fälle, in denen die Arbeit, die getan werden soll, aufgeteilt werden und unter Arbeitern verteilt werden kann. Ich habe versucht, ein sehr einfaches Beispiel Multiprozessing von here:Gleiche Ausgabe in verschiedenen Arbeitern im Multiprocessing

import multiprocessing 
import numpy as np 
import time 

def do_calculation(data): 
    rand=np.random.randint(10) 
    print data, rand 
    time.sleep(rand) 
    return data * 2 

if __name__ == '__main__': 
    pool_size = multiprocessing.cpu_count() * 2 
    pool = multiprocessing.Pool(processes=pool_size) 

    inputs = list(range(10)) 
    print 'Input :', inputs 

    pool_outputs = pool.map(do_calculation, inputs) 
    print 'Pool :', pool_outputs 

Das obige Programm erzeugt folgende Ausgabe:

Input : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
0 7 
1 7 
2 7 
5 7 
3 7 
4 7 
6 7 
7 7 
8 6 
9 6 
Pool : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

Warum ist die gleiche Zufallszahl gedruckt zu werden? (Ich habe 4 CPUs in meiner Maschine). Ist das der beste/einfachste Weg?

+0

möglich Duplikat [Python Multiprocessing mit unterschiedlichem Zufallskeim für jeden Prozess] (http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- random-seed-for-proach-Prozess) –

+0

Gibt es keine Möglichkeit, die Zufallszahl für jeden Prozess festzulegen, der Zufallszahlen verwenden könnte? Sagen wir, man benutzt das Modul zufällig, numpy, scipy, tensorflow und wer weiß was noch. Ist der einzige Weg, um sicherzustellen, dass der Prozess eine andere zufällige Saat hat, um durch jeden von diesen zu gehen und den Staat manuell einzustellen? –

Antwort

12

Ich denke, dass Sie den Zufallszahlengenerator unter Verwendung numpy.random.seed in Ihrer do_calculation Funktion neu seed müssen.

Meine Vermutung ist, dass der Zufallszahlengenerator (RNG) beim Importieren des Moduls gesetzt wird. Wenn Sie Multiprocessing verwenden, verzweigen Sie den aktuellen Prozess mit dem bereits gesetzten RNG. Daher teilen alle Ihre Prozesse den gleichen Startwert für den RNG, sodass sie die gleichen Zahlenfolgen generieren.

zB:

def do_calculation(data): 
    np.random.seed() 
    rand=np.random.randint(10) 
    print data, rand 
    return data * 2 
+0

Kannst du mir zeigen, wie man 'seed' in' do_calculation' setzt? Wenn ich 'seed' in' main' lege, bekomme ich immer noch eine ähnliche Ausgabe. – imsc

+0

@imsc - Entschuldigung, ich habe nicht sorgfältig genug gelesen. Sie wollen 'np.random.seed' (nicht' random.seed'). Ich habe mich entsprechend aktualisiert. – mgilson

+0

Ich bekomme immer noch ein ähnliches Ergebnis. – imsc

Verwandte Themen