lambda函数在多进程中不起作用

lambda function not working in multi-process

我正在尝试对多进程中的多个参数使用 lambda 函数。但是,它无法正常工作。没有 运行 时间错误,但根据 activity 监视器,CPU 在 python 上不工作。但是,repeat 功能正常运行。我的代码如下所示:

def testfun(a,b,c,d,e,f):
    for i in range(100000000):
        pass
    return a+b+c+d+e+f

def multi_process_tfem(a, b, ksis, w, wn, k):
    args = ((a, b, ksi, w, wn, k) for ksi in ksis)
    with concurrent.futures.ProcessPoolExecutor() as executor:    
        #results = executor.map(testfun, repeat(a), repeat(b), ksis, repeat(w), repeat(wn), repeat(k)) # working
        results = executor.map(lambda args: testfun(*args), args) # not working
    rho = np.array(list(results))
    return rho

在模块 multiprocessing you could use starmap 中,而不是 maplambda。但是concurrent好像没有。但是,当您尝试在 multiprocessing 中使用 lambda 时,它表明它无法 pickle lambda 函数以将其发送到进程 - 它也可能是 concurrent 中的问题但它不显示它。


您可以将其作为一个参数获取并在函数中解压

def testfun(args):
    a,b,c,d,e,f = args    
    return a+b+c+d+e+f

或者您必须将其定义为普通函数

def unpack_testfun(args):
    return testfun(*args)

并用它代替 testfun

executor.map(unpack_testfun, args)

示例代码

import concurrent.futures

def testfun1(args):
    a,b,c,d,e,f = args    
    return a+b+c+d+e+f

def multi_process_tfem1(a, b, ksis, w, wn, k):
    args = ((a, b, ksi, w, wn, k) for ksi in ksis)

    with concurrent.futures.ProcessPoolExecutor() as executor:    
        results = executor.map(testfun1, args) 
    return list(results)

print(multi_process_tfem1(1,1,[1,2,3],1,1,1))

# ---

def testfun2(a,b,c,d,e,f):
    return a+b+c+d+e+f

def unpack(args):
    return testfun2(*args)

def multi_process_tfem2(a, b, ksis, w, wn, k):
    args = ((a, b, ksi, w, wn, k) for ksi in ksis)

    with concurrent.futures.ProcessPoolExecutor() as executor:    
        results = executor.map(unpack, args) 
    return list(results)

print(multi_process_tfem2(1,1,[1,2,3],1,1,1))