【发布时间】:2013-04-09 10:46:13
【问题描述】:
我正在做梯度下降(准确地说是 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 的定义,但函数的第一行是打印语句。所以,当我执行这个函数时,打印语句应该被执行 100*50 次。但这不会发生。更重要的是,我得到不同数量的控制台输出不同的次数。
怎么了?
【问题讨论】:
-
怀疑你的问题是
map_ascync是非阻塞的。如果您改用map,它是否可以正常工作? -
@tcaswell:我认为你是对的。然后添加一个简单的 sleep() 函数,在所有异步调用完成它们的执行时暂停主进程几秒钟,对吧?
-
您是否在未显示的代码行中对
AsyncResult对象调用get? -
@Jared:我还没有编写那段代码,但是是的,我会在
AsyncResult对象上调用get。我想这会等待所有异步调用完成,对吧? -
@Jared:我猜
map_async返回的可迭代对象不会等到所有调用完成(如果说有 100 万个调用),而是会在调用完成时开始填充可迭代对象他们的执行。
标签: python python-2.7 numpy parallel-processing multiprocessing