【问题标题】:Does joblib.Parallel keep the original order of data passed?joblib.Parallel 是否保持传递数据的原始顺序?
【发布时间】:2019-11-01 16:46:47
【问题描述】:

我想问同样的问题 Python 3: does Pool keep the original order of data passed to map? 用于工作库。例如:

Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in x)

语法有点暗示,但我总是担心并行处理的输出顺序,我不想根据未记录的行为编写代码。

【问题讨论】:

    标签: python multiprocessing joblib


    【解决方案1】:

    TL;DR - 它保留了两个后端的顺序。

    扩展@Chris Farr 的答案,我实施了一个简单的测试。我让一个函数等待一些随机的时间(您可以检查这些等待时间是否不相同)。我知道每次都保留订单,两个后端都保留。

    from joblib import Parallel, delayed
    import numpy as np
    import time
    
    def f(wait):
        time.sleep(wait)
        return wait
    
    n = 50
    waits = np.random.uniform(low=0, high=1, size=n)
    res = Parallel(n_jobs=8, backend='multiprocessing')(delayed(f)(wait) for wait in waits)
    np.all(res == waits)
    

    【讨论】:

      【解决方案2】:

      Per the joblib documentation 您可以将backend 指定为multiprocessing,它基于multiprocessing.Pool。然后另一个答案将适用于结果实际上是有序的。

      Parallel(n_jobs=2, backend="multiprocessing")(delayed(sqrt)(i ** 2) for i in x)
      

      然而,默认情况下,他们使用loky,虽然不是很清楚,但可以通过实施测试来检测。

      【讨论】:

        猜你喜欢
        • 2017-05-07
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多