如何运行多个函数以并行返回各个列表

时间:2018-04-03 21:53:59

标签: python multithreading multiprocessing pool simultaneous

在示例代码中,我想并行运行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)

任何非常感谢的信息。提前致谢。

2 个答案:

答案 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]), [])