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

Hen*_*ier 4 python mathematical-optimization multiprocessing python-multithreading python-multiprocessing

我有一个与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

Run Code Online (Sandbox Code Playgroud)

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

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

我是多处理库的新手,可以伸出援助之手。对于那些对一些背景感兴趣的人:我想为一堆不同的场景/预测最小化函数“opti_fun”。计算我的错误度量/基准(“error_fun_opti”)是安静的计算密集型,因此我尝试并行化这一步。

Dan*_* D. 8

将函数提升到顶层并用于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)))
Run Code Online (Sandbox Code Playgroud)