【问题标题】:Incorrect output when using multiprocessing使用多处理时输出不正确
【发布时间】: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


【解决方案1】:

您的问题是您使用的是map_async 而不是map。这意味着一旦所有工作都被外包到池中,它将继续循环,即使所有工作尚未完成。我不清楚下一个循环开始时仍在运行的工作会发生什么,但如果这些应该是迭代,我无法想象它是 a) 好 b) 定义明确。

如果您使用map,它将阻塞循环,直到 所有 工作函数完成,然后再继续下一步。我想你可以用sleep 来做这件事,但这只会让事情变得更复杂而没有任何收获。 map 将等待恰好完成所有操作所需的最短时间。

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 2021-10-23
    • 2013-11-27
    • 2023-02-15
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多