【问题标题】:Python multiprocessing pool for parallel processing用于并行处理的 Python 多处理池
【发布时间】:2013-06-26 11:20:24
【问题描述】:

我想并行执行一些进程并等待它们完成。所以我写了这段代码:

pool = mp.Pool(5)
for a in table:
    pool.apply(func, args = (some_args))
pool.close()
pool.join()

我会在这里并行执行func 的 5 个进程吗? 或者唯一的选择是apply_async

【问题讨论】:

    标签: python parallel-processing multiprocessing pool python-multithreading


    【解决方案1】:

    The docs 对此非常清楚:每次调用apply 都会阻塞,直到结果准备好。使用apply_async

    【讨论】:

    • 那么我为什么需要池?为什么我需要多处理?使用 apply_ascync 你必须指定回调。我想要一些并行执行过程,等待它们,然后做其他事情的东西。特别是我有任务表。我想遍历表执行每个进程块,等待这个块完成,然后并行执行下一个进程块等。使用回调,这非常复杂......
    • @mnowotka 不,回调是可选的。您可以通过回调或在apply_async 返回的对象上调用get 来访问func 的返回值。在您的示例中,您根本不使用返回值。在这种情况下,您可以使用 apply_async 而无需进一步更改。
    • 不,回调也是获取所有进程完成的信息。即使我不关心返回值为了创建另一个进程块,我需要知道前一个块已经完成。用回调实现这一点真的很痛苦,这就是为什么当你可以说 when(task1, task2).then(task3) 时,javascript 有很多 Promise 的实现。
    • @mnowotka 你可以考虑mp.map
    • @mnowotka map(...) 等待结果,相当于map_async(...).get()。与apply 不同,map 能够在多次调用该函数时启动并行工作(对于可迭代参数中的每个项目)。
    【解决方案2】:

    另一种解决方案是使用Pool.imap_unordered()

    以下代码启动了一个由 5 个工作人员组成的池。然后它将三个作业发送到池中。第一个是 num=1,第二个是 num=2,以此类推。函数imap_unordered 表示当第一个结果出现时,来自任何工作人员,将其返回以进行进一步处理。在这种情况下,循环会按出现的结果打印结果,没有任何特定的顺序。

    import multiprocessing
    
    def calc(num):
        return num*2
    
    pool = multiprocessing.Pool(5)
    for output in pool.imap_unordered(calc, [1,2,3]):
        print 'output:',output
    

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 2012-01-23
      • 2021-07-24
      • 2020-08-14
      • 2016-11-10
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多