加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何并行运行生成器代码?

发布时间:2020-12-20 13:16:48 所属栏目:Python 来源:网络整理
导读:我有这样的代码: def generator(): while True: # do slow calculation yield x 我想将慢速计算移到单独的进程中. 我在python 3.6中工作,所以我有concurrent.futures.ProcessPoolExecutor.如何使用它并发生成器并不明显. 与使用map的常规并发场景的不同之处
我有这样的代码:

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

我想将慢速计算移到单独的进程中.

我在python 3.6中工作,所以我有concurrent.futures.ProcessPoolExecutor.如何使用它并发生成器并不明显.

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

我不必使用并发,多处理也没关系.这是一个类似的问题,如何在发电机内使用它并不明显.

轻微扭曲:生成器返回的每个值都是一个大的numpy数组(10兆字节左右).如何在不进行酸洗和去除油墨的情况下进行转移?我已经看过多处理的文档.Array但是如何使用它来传输一个numpy数组并不是很明显.

解决方法

在这种情况下,我通常使用 joblib库.它是一个基于多处理的并行计算框架.它支持精确的memmapping,适用于必须处理大型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数组的问题,并且仍然可以从真正的并行性中获益.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读