如何 运行 多个函数并行地 return 各自的列表
How to run multiple functions to return respective lists in parallel
在示例代码中,我想 运行 4 个并行函数,return 列出每个函数的值。 multiprocessing 包是否适合这项任务?如果可以,我该如何实施?
示例代码:
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)
非常感谢任何信息。提前致谢。
如 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
。)
假设(因为我的问题从未得到回答)每个函数接收相同的数字:
def apply_func(f):
return f(3)
full_list = sum(pool.map(apply_func, [func_a, func_b, func_c, func_d]), [])
在示例代码中,我想 运行 4 个并行函数,return 列出每个函数的值。 multiprocessing 包是否适合这项任务?如果可以,我该如何实施?
示例代码:
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)
非常感谢任何信息。提前致谢。
如 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
。)
假设(因为我的问题从未得到回答)每个函数接收相同的数字:
def apply_func(f):
return f(3)
full_list = sum(pool.map(apply_func, [func_a, func_b, func_c, func_d]), [])