2012-10-16 10 views
9

Ho casi molto semplici in cui il lavoro da svolgere può essere suddiviso e distribuito tra i lavoratori. Ho provato un esempio molto semplice multiprocessing da here:Stesso risultato in diversi operatori nel 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 

Il programma sopra produce il seguente output:

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] 

Perché lo stesso numero casuale sempre stampato? (Ho 4 cpu nella mia macchina). È questo il modo migliore/più semplice per andare avanti?

+0

possibile duplicato [Uso multiprocessore pitone con seme casuale diverso per ogni processo] (http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- random-seed-for-each-process) –

+0

Non esiste un modo per impostare il numero casuale per ogni processo che potrebbe utilizzare numeri casuali? Diciamo che uno usa il modulo random, numpy, scipy, tensorflow e chissà cos'altro. È l'unico modo per assicurarsi che il processo abbia un seme casuale diverso per passare attraverso ciascuno di questi e impostare manualmente lo stato? –

risposta

12

Penso che sarà necessario ri-seminare il generatore di numeri casuali utilizzando numpy.random.seed nella funzione do_calculation.

La mia ipotesi è che il generatore di numeri casuali (RNG) venga seminato quando si importa il modulo. Quindi, quando si utilizza il multiprocessing, si esegue il fork del processo corrente con l'RNG già seminato. Pertanto, tutti i processi condividono lo stesso valore di inizializzazione per l'RNG e pertanto generano le stesse sequenze di numeri.

es:

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

Puoi mostrarmi come mettere 'seed' in' do_calculation'. Se metto 'seed' in' main' ottengo ancora risultati simili. – imsc

+0

@imsc - Scusa, non ho letto abbastanza attentamente. Vuoi 'np.random.seed' (non' random.seed'). Ho aggiornato di conseguenza. – mgilson

+0

Ho ancora risultati simili. – imsc

Problemi correlati