下記のようなコードを実行すると、0,2,4,6,8がシャッフルされて出力されます。
可能なら計算を実行した順番通り[0,2,4,6,8]が
固定で出てくるようにしたいのですが、いい方法はあるでしょうか?
(備考)
・実際の配列は時系列の3次元空間データ(つまり4次元)を時系列順に複数に分割して処理している
・上のせいで計算終了時間にズレが生じて、最後に結合した時に時間がしばしばずれる
・calc関数の多分pickle化できないので、Poolではできないと思われる
・普通に直列計算すると1回数日程度かかり、今後相当な回数実行する予定
python
1def calc(queue, p, proc, x=[i for i in range(5)]): 2 #計算を分割するための関数 3 #配列をproc個に分割したもののうち前から数えてp番目の計算を行っている 4 5 import random 6 L = len(x) 7 8 #抜き出す部分の指定 9 ini = L * p // proc 10 fin = L * (p+1) // proc 11 if fin > L: 12 fin=L 13 14 #計算部分 15 tmp = [x[i]*2 for i in range(ini,fin)] 16 time.sleep(random.randint(1,10)) 17 queue.put(tmp) 18 19 return queue 20 21def _parallel(func, proc): 22 import multiprocessing as mp 23 queue = mp.Queue() 24 #計算を投げている部分 25 #下の実行順通りに出力させたい 26 ps = [ mp.Process(target=func, args=(queue, i, proc)) for i in range(proc)] 27 for p in ps: 28 p.start() 29 return queue 30 31#実行部分 32proc=8 33queue=_parallel(calc, proc) 34value=[] 35for l in range(proc): 36 tmp = queue.get() 37 for i in tmp: 38 value.append(i) 39#このままだと0,2,4,6,8がランダムに並んで出力される 40#計算終了時間が正確にわからない状態で[0,2,4,6,8]で確実に出力されるようにしたい。 41print(value)
回答2件
あなたの回答
tips
プレビュー