2016-12-18 2 views
1

大規模な距離行列を計算するための並列ソフトウェアを実装する必要があります。マルチプロセッシングが機能しない

これは私が書いたコードです:

subset = #[list of proper objects] 
nthreads = 10 

def compute_distance_corcoeff(geneset, offset, q): 
    for i in range(offset, len(geneset), nthreads): 
     g1 = geneset[i] 
     dvect = [np.corrcoef(g1.expr, g2.expr)[0,1] for g2 in geneset] 
     q.put((i,dvect)) 

queue = Queue() 
processes = [] 
for off in range(nthreads): 
    processes.append(Process(target=compute_distance_corcoeff, args=(subset, off, queue))) 

for p in processes: 
    p.start() 
for p in processes: 
    p.join() 

私は、キューからの部分的な結果を収集します。

残念ながら、何も起こっていないようです。それはjoin()で立ち往生しているようです。

私はここで何が欠けていますか?

+0

「適切なオブジェクト」とはどういう意味ですか? 'compute_distance_corcoeff'にprintステートメントを置いて、実際に実行されていることを確認すると印刷されますか?たぶん、本当に長い時間がかかっているかもしれません。 –

+1

['' multiprocessing.Pool'](https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool)を使って 'Pool'オブジェクトを' join() 'することをお勧めします作成した。 Windowsを使用している場合は、メインプロセスのコードとサブプロセスのコードを区別するために、 'if __name__ == '__main __:'を必ず追加してください。 – martineau

+0

おそらく 'p.close()'がありませんか? –

答えて

1

multiprocessing programming guidelinesで説明したように、まずQueueを空にしてからProcessに参加する必要があります。

あなたのロジックは、Queueのメッセージが消費されるのを待っているため、プロセスが終了できないため、デッドロック状態になります。