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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lambda函数在多进程中不起作用相关的知识,希望对你有一定的参考价值。

我正在尝试将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
答案

在模块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))

以上是关于lambda函数在多进程中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

java代码在片段活动中不起作用

Javascript代码片段在drupal中不起作用

onRequestPermissionsResult 在片段中不起作用

Onclicklistener 在片段列表视图中不起作用

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用

按钮在片段中不起作用