【问题标题】:How to run generator code in parallel?如何并行运行生成器代码?
【发布时间】:2017-08-18 17:59:33
【问题描述】:

我有这样的代码:

def generator():
    while True:
        # do slow calculation
        yield x

我想将缓慢的计算转移到单独的进程中。

我正在使用 python 3.6,所以我有 concurrent.futures.ProcessPoolExecutor。如何使用它来并发化生成器并不明显。

与使用map 的常规并发场景的不同之处在于,这里没有要映射的内容(生成器永远运行),我们不希望一次获得所有结果,我们希望将它们排队等待直到在计算更多结果之前队列未满。

我不必使用concurrentmultiprocessing 也可以。这是一个类似的问题,不清楚如何在生成器中使用它。

轻微扭曲:生成器返回的每个值都是一个大型 numpy 数组(大约 10 兆字节)。我如何在没有酸洗和解酸的情况下转移它?我已经看过 multiprocessing.Array 的文档,但是如何使用它来传输一个 numpy 数组并不完全清楚。

【问题讨论】:

    标签: python python-3.x parallel-processing generator concurrent.futures


    【解决方案1】:

    在这种情况下,我通常使用joblib 库。它是一个基于多处理的并行计算框架。对于必须处理大型 numpy 数组的情况,它支持精确映射。我相信这值得您检查。

    也许 joblib 的文档在这一点上不够明确,仅显示带有 for 循环的示例,因为您想使用生成器,我应该指出它确实适用于生成器。可以实现您想要的示例如下:

    from joblib import Parallel, delayed
    def my_long_running_job(x):
        # do something with x
    # you can customize the number of jobs
    Parallel(n_jobs=4)(delayed(my_long_running_job)(x) for x in generator())
    

    编辑:我不知道你想做什么样的处理,但如果它释放了 GIL,你也可以考虑使用线程。这样您就不必在进程之间传输大型 numpy 数组,并且仍然受益于真正的并行性。

    【讨论】:

    • 除了说“使用库 X”之外,这似乎并没有真正解决所提出的实际问题。如果您有问题或需要澄清,如您的编辑中所述,您应该发表评论。如果您提供有关如何根据 OP 需要确切地使用生成器的解释(我在您的链接中看到的示例不是生成器)并且 OP 添加外部库依赖项没有问题,然后 我会删除我的 -1。
    • 我不同意我做的不止这些。我在他提到的两个方面给了 OP 2 种方法来解决他的问题:实际并行化和处理大型 numpy 数组作为返回值。更多信息并不真正相关,因为我在问题中提到了唯一需要的相关信息:GIL 是否已发布。我觉得你的判断有点苛刻。所以是的,我给了他一个图书馆的指针,但实际上做得更多?
    • 您在 SO 中发布的 here 的响应做了 3 件事:1)将 OP 指向非标准库(不知道是否是(不是) OP的问题); 2) 没有说明如何将库与 generator 一起使用或根本没有说明(甚至不是一个简单的示例); 3) 继续在一个关于 parallelism 的问题中明确讨论 concurrency w/线程,这是不同的。这篇文章相当于一个更冗长的仅限链接的答案,这通常是不受欢迎的。所以不,我认为这篇文章实际上并没有解决问题或帮助 OP 解决问题。这与仅发布 URL 有何不同?
    • 1) OP 说多处理没问题,我明确地说 joblib 只是多处理的包装器。 2)该示例从文档中很简单,实际上只有一种用法,它适用于生成器,但 Oki 可以展示一个示例 3)我建议 OP,如果他的工作释放锁,他可以实现与线程的并行性,在在这种情况下,这将是他提出的第二个问题的解决方案。
    • 我也可以用memmap添加一个例子,但由于它真的取决于OP的需求,我觉得最好的办法是告诉他这种能力存在,并指出他的文档这将比我在 SO 答案中所能做的要好得多......
    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2022-10-02
    • 2017-09-22
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多