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

时间:2019-12-21 08:24:35

标签: python python-multiprocessing

我正在尝试将lambda函数用于多进程中的多个参数。但是,它不能正常工作。没有运行时错误,但根据活动监视器,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

1 个答案:

答案 0 :(得分:0)

在模块multiprocessing中,您可以使用starmap代替maplambda。但是似乎concurrent没有它。但是,当您尝试在lambda中使用multiprocessing时,它表明它无法腌制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))
相关问题