在示例代码中,我想并行运行4个函数并返回每个函数的列表值。多处理包是否适合此任务?如果是这样,我该如何实现呢?
示例代码:
from multiprocessing import Pool
def func_a(num):
return([1+num,2+num,3+num])
def func_b(num):
return([10+num,11+num,12+num])
def func_c(num):
return([20+num,21+num,22+num])
def func_d(num):
return([30+num,31+num,32+num])
if __name__ == '__main__':
pool = Pool(processes=2)
list_a = ???
list_b = ???
list_c = ???
list_d = ???
full_list = []
for item in list_a:
full_list.append(item)
for item in list_b:
full_list.append(item)
for item in list_c:
full_list.append(item)
for item in list_d:
full_list.append(item)
任何非常感谢的信息。提前致谢。
答案 0 :(得分:1)
如Process Pools中所述,您需要将所有作业提交到池中,然后等待所有结果。
我不确定你想要传递给这些函数的参数是什么,因为它不在你的问题或你的代码中,但我只会构成一些任意的东西。
if __name__ == '__main__':
pool = Pool(processes=2)
result_a = pool.apply_async(func_a, (23,))
result_b = pool.apply_async(func_b, (42,))
result_c = pool.apply_async(func_c, (fractions.Fraction(1, 2),))
result_d = pool.apply_async(func_a, (1j * math.pi,))
full_list = []
for item in result_a.get():
full_list.append(item)
for item in result_b.get():
full_list.append(item)
for item in result_c.get():
full_list.append(item)
for item in result_d.get():
full_list.append(item)
您可以通过多种方式大幅简化此操作(例如,每个for
循环都可以被extend
的单个调用替换,或者您只需编写full_list = result_a.get() + result_b.get() + result_c.get() + result_d.get())
,但这样是对现有代码的最小改动。(如果你真的想简化这段代码,我认为你首先会对concurrent.futures.ProcessPoolExecutor
更开心。)
答案 1 :(得分:0)
假设(因为我的问题从未得到回答)每个函数都收到相同的数字:
def apply_func(f):
return f(3)
full_list = sum(pool.map(apply_func, [func_a, func_b, func_c, func_d]), [])