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 中,而不是 map
和 lambda
。但是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))
我正在尝试对多进程中的多个参数使用 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 中,而不是 map
和 lambda
。但是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))