我正在做渐变下降(准确地说是100次迭代)。每个数据点可以并行分析,有50个数据点。由于我有4个核心,因此我使用multiprocessing.Pool
创建了一个由4名工作人员组成的池。该计划的核心如下:
# 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)
现在,我没有包含函数train_go_crf
的定义,但函数的第一行是print语句。因此,当我执行此函数时,print语句应该执行100 * 50次。但这不会发生。更重要的是,我得到不同数量的控制台输出不同的次数。
怎么了?
答案 0 :(得分:1)
您的问题是您使用的是map_async
而不是map
。这意味着一旦将所有工作都放到池中,它将继续循环,即使所有工作都没有完成。我不清楚在下一个循环开始时仍会运行的工作会发生什么,但如果这些应该是迭代,我无法想象它是a)好的b)定义良好。
如果使用map
,它将阻止循环,直到所有工作程序功能完成后再继续下一步。我想你可以用sleep
做到这一点,但这只会让事情变得更复杂,没有收获。 map
会等待完全所需的最短时间,让一切都完成。