2012-10-16 5 views
9

Mam bardzo proste przypadki, w których praca do wykonania może zostać rozbita i rozdzielona między pracowników. Próbowałem bardzo prosty przykład z here Multiprocessing:Ta sama wydajność dla różnych pracowników w procesie wieloprocesowym

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 

Powyższy program wygeneruje następujące wyniki:

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] 

Dlaczego jest coraz drukowane taką samą liczbę losową? (Mam 4 procesory na moim komputerze). Czy to najlepszy/najprostszy sposób na kontynuowanie?

+0

możliwe duplikat [używa pytona wieloprocesorowych o różnym nasienie losowo dla każdego procesu] (http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- random-seed-for-each-process) –

+0

Czy nie ma możliwości ustawienia liczby losowej dla każdego procesu, który może wykorzystywać liczby losowe? Powiedzmy, że używa się modułu losowego, numpy, scipy, tensorflow i kto wie co jeszcze. Czy jest to jedyny sposób, aby upewnić się, że proces ma inny losowy materiał siewny, aby przejść przez każdy z nich i ręcznie ustawić stan? –

Odpowiedz

12

Myślę, że będziesz musiał ponownie wysiać generator liczb losowych za pomocą numpy.random.seed w swojej funkcji do_calculation.

Domyślam się, że generator liczb losowych (RNG) zostanie zaimplementowany podczas importowania modułu. Następnie, gdy używasz przetwarzania wieloprocesowego, rozwidlasz bieżący proces z już zaimplementowanym RNG - W ten sposób wszystkie twoje procesy dzielą tę samą wartość początkową dla RNG, więc generują te same sekwencje liczb.

np

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

Czy możesz pokazać mi, jak umieścić 'seed' w' do_calculation'. Jeśli umieściłem 'seed' w' main', nadal otrzymuję podobne wyniki. – imsc

+0

@imsc - Przepraszam, nie czytałem wystarczająco uważnie. Chcesz 'np.random.seed' (nie' random.seed'). Zaktualizowałem odpowiednio. – mgilson

+0

Nadal mam podobny wynik. – imsc