2012-10-16 27 views
9

Yapılması gereken işlerin işçiler arasında parçalanıp dağıtılabileceği çok basit vakalarım var. Neden aynı rasgele sayıÇok işlemcili farklı çalışanlarda aynı çıktı

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] 

baskılı oluyor:

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 

yukarıdaki program şu çıktıyı üretir: Ben here den çok basit çoklu işlem örnek çalıştı? (Makinemde 4 cpus var). Bu devam etmenin en iyi/en basit yolu mu?

+0

[Her işlem için farklı bir rasgele tohum kullanarak piton çoklu işlem] (olası çift http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- rasgele sayı-her işlem için) –

+0

Rastgele sayıları kullanabilecek her işlem için rasgele sayı belirlemenin bir yolu yok mu? Biri modülü rastgele, numpy, scipy, tensorflow kullanır ve kim bilir başka ne bilir. Sürecin her birinden geçmek ve durumu el ile ayarlamak için farklı bir rastgele tohum olduğundan emin olmanın tek yolu var mı? –

cevap

12

do_calculation işlevinde numpy.random.seed kullanarak rasgele sayı üretecini yeniden tohumlamanız gerekeceğini düşünüyorum.

Tahminimce, modülü içe aktarırken rasgele sayı üretecinin (RNG) ekilebilmesi. Daha sonra, çoklu işlemeyi kullandığınızda, mevcut işlemi zaten tohumlanmış RNG ile çatallandırırsınız. Böylece, tüm süreçleriniz RNG için aynı tohum değerini paylaşır ve böylece aynı sayı dizilerini oluştururlar.

örn

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

"seed" in "do_calculation" içine nasıl yerleştirileceğini gösterebilir misin? Eğer 'tohum'u' ana 'içine koyarsam hala benzer bir çıktı elde ediyorum. – imsc

+0

@imsc - Üzgünüm, yeterince okumuştum. 'Np.random.seed' (' random.seed' değil) istiyorsunuz. Buna göre güncelledik. – mgilson

+0

Hala benzer bir sonuç alıyorum. – imsc

İlgili konular