0

私は勾配降下を行っています(正確には100回の反復)。各データ ポイントは並行して分析でき、50 個のデータ ポイントがあります。コアが 4 つあるので、 を使用して 4 つのワーカーのプールを作成しますmultiprocessing.Pool。プログラムのコアは次のようになります。

# Read the sgf files (total 50)
(intermediateBoards, finalizedBoards) = read_sgf_files()

# Create a pool of processes to analyze game boards in parallel with as 
# many processes as number of cores
pool =  Pool(processes=cpu_count())

# Initialize the parameter object
param = Param()

# maxItr = 100 iterations of gradient descent
for itr in range(maxItr):
    args = []
    # Prepare argument vector for each file
    for i in range(len(intermediateBoards)):
        args.append((intermediateBoards[i], finalizedBoards[i], param))
    # 4 processes analyze 50 data points in parallel in each iteration of 
    # gradient descent
    result = pool.map_async(train_go_crf_mcmc, args)

ここで、 function の定義を含めていませんが、関数train_go_crfの最初の行は print ステートメントです。したがって、この関数を実行すると、print ステートメントが 100*50 回実行されるはずです。しかし、そうはなりません。さらに、さまざまな回数のコンソール出力が得られます。

どうしたの?

4

1 に答える 1

1

あなたの問題は、map_asyncの代わりに使用していることですmap。これは、すべての作業がプールにファームアウトされると、すべての作業が完了していなくても、ループを続行することを意味します。次のループが開始されたときにまだ実行中の作業がどうなるかはわかりませんが、これらが反復であると想定される場合、a) 良い b) 明確に定義されているとは想像できません。

を使用すると、次のステップに進む前にすべてのワーカー関数が終了するmapまでループがブロックされます。でこれを行うことができると思いますが、それは物事をより複雑にするだけで何の利益もありません。 すべてが完了するのに必要な最小限の時間だけ待機します。sleepmap

于 2013-04-16T21:25:35.770 に答える