多处理池映射:AttributeError:无法腌制本地对象

时间:2020-02-07 15:28:31

标签: python multiprocessing python-multiprocessing mathematical-optimization python-multithreading

我有一个非常相似的问题 Python Multiprocessing Pool Map: AttributeError: Can't pickle local object

我想我知道问题出在哪里,只是不确定如何解决。 “ Pool.map”需要顶级功能作为输入。但我不知道该如何改写这个问题:

简化的代码版本:

import os as os
from multiprocessing import Pool
import numpy as np
def opti_fun_data(prediction):
    def opti_fun(x):
        def error_fun(i):
            return error_fun_opti(x,prediction,i)
        try:
            pool = Pool(np.max([os.cpu_count()-1,1]))
            error = np.mean(pool.map(error_fun, range(M)))
        finally: # To make sure processes are closed in the end, even if errors happen
            pool.close()
            pool.join()
        return error
    return opti_fun

如果我跑步 opti_fun_data(prediction)(x0) 我得到

Can't pickle local object 'opti_fun_data.<locals>.opti_fun.<locals>.error_fun'

我是多处理库的新手,可以伸出援手。 对于那些对背景知识感兴趣的人: 我想最小化函数“ opti_fun”,以适应多种不同的场景/预测。计算我的错误量度/基准(“ error_fun_opti”)是计算密集型工作,因此我尝试并行化此步骤。

1 个答案:

答案 0 :(得分:2)

将函数提升到最高级别,并使用functools.partial提供范围值而不是嵌套范围。

def error_fun(x, prediction, i):
    return error_fun_opti(x, prediction, i)

error = np.mean(pool.map(functools.partial(error_fun, x, prediction), range(M)))