【问题标题】:Calculations are not stored in the passed arguments when processes are executed in parallel并行执行进程时,计算不会存储在传递的参数中
【发布时间】:2017-10-30 14:39:37
【问题描述】:

我有一个函数应用于不同的数据块。由于每个块都独立于其余块,因此我希望并行执行所有块的函数。

我有一个 result 字典,它应该保存每个块的计算输出。

我是这样做的:

from joblib import Parallel, delayed
import multiprocessing

cpu_count = multiprocessing.cpu_count() 

# I have 8 cores, so I divide the data into 8 chunks.
endIndeces = divideIndecesUniformly(myData.shape[0], cpu_count) # e.g., [0, 125, 250, ..., 875, 1000]

# initialize result dictionary with empty lists.
result = dict()
for i in range(cpu_count):
    result[i] = []

# Parallel execution for 8 chunks
Parallel(n_jobs=cpu_count)(delayed(myFunction)(myData, start_idx=endIndeces[i], end_idx=endIndeces[i+1]-1, result, i) for i in range(cpu_count))

但是,当执行完成时,result 具有所有初始空列表。我想如果我在每个数据块上连续执行该函数,它就可以正常工作。例如,如果我将最后一行替换为以下内容,result 将拥有所有计算值。

# Instead of parallel execution, call the function in a for-loop.
for i in range(cpu_count):
    myFunction(myData, start_idx=endIndeces[i], end_idx=endIndeces[i+1]-1, result, i)

在这种情况下,result 值会更新。

似乎当函数并行执行时,它无法写入给定的字典(result)。所以,我想知道如何获得每个数据块的函数输出?

【问题讨论】:

    标签: python python-3.x parallel-processing


    【解决方案1】:

    joblib,默认使用python中的multiprocessing模块。根据this SO Answer,当参数传递给新进程时,它们会创建一个fork复制当前进程的内存空间。这意味着myFunction 本质上是在处理result 的副本,而不是修改原始版本。

    我的建议是让myFunction 将所需数据作为列表返回。对Process 的调用将返回由myFunction 生成的列表的列表。从那里,很容易将它们添加到结果中。它可能看起来像这样:

    from joblib import Parallel, delayed
    import multiprocessing
    
    if __name__ == '__main__':
        cpu_count = multiprocessing.cpu_count() 
    
        endIndeces = divideIndecesUniformly(myData.shape[0], cpu_count)
    
        # make sure myFunction returns the grouped results in a list
        r = Parallel(n_jobs=cpu_count)(delayed(myFunction)(myData, start_idx=endIndeces[i], end_idx=endIndeces[i+1]-1, result, i) for i in range(cpu_count))
    
        result = dict()
        for i, data in enumerate(r):  # cycles through each resultant chunk, numbered and in the original order
            result[i] = data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多