22

実行する作業を分割してワーカー間で分散できる非常に単純なケースがあります。ここから非常に単純なマルチプロセッシングの例を試しました:

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

上記のプログラムは、次の出力を生成します。

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]

同じ乱数が出力されるのはなぜですか? (私のマシンには 4 つの CPU があります)。これは先に進むための最良/最も簡単な方法ですか?

4

3 に答える 3

21

関数でnumpy.random.seedを使用して乱数ジェネレーターを再シードする必要があると思いますdo_calculation

モジュールをインポートすると、乱数ジェネレーター (RNG) がシードされると思います。次に、マルチプロセッシングを使用する場合、シード済みの RNG を使用して現在のプロセスをフォークします。つまり、すべてのプロセスが RNG の同じシード値を共有しているため、同じ数列が生成されます。

例えば:

def do_calculation(data):
    np.random.seed()
    rand=np.random.randint(10)
    print data, rand
    return data * 2
于 2012-10-16T12:55:07.003 に答える