首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将回忆录调用并行化到外部程序?

如何将回忆录调用并行化到外部程序?
EN

Stack Overflow用户
提问于 2019-07-08 06:14:57
回答 2查看 176关注 0票数 0

我有一个用Python编写的数据处理程序,它需要在一个阶段调用外部程序。分析表明,大约50%的总处理时间是在这一阶段。

我有一台多核的计算机,所以并行似乎是解决方案。问题是,这个电话是回忆录的:

代码语言:javascript
复制
def one_stage_of_processing(long_list_of_inputs, cache={}):
    outputs = []
    for input in list_of_inputs:
        outputs.append(expensive_external_processing(input, cache))
    return outputs

def expensive_external_processing(input, cache):
    if input not in cache:
        cache[input] = subprocess.run(...).stdout
    return cache[input]

使用C的经验使我对破坏缓存的种族条件感到警惕。

什么是最好的,最毕达通的方法来并行这一阶段的处理?我想保持回忆录的位置,因为删除它会使运行时增加4倍。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-08 06:22:33

您可以异步启动任务,然后将未来放入备忘录中。任何询问备忘录结果的人都会遇到三种状态中的一种:没有备忘(因此启动一个新的昂贵的外部处理任务)、未完成的未来备忘录(您可以等待它,或者承认它尚未完成并在完成之前去做其他事情),或者完成未来的备忘(结果立即可用)。这样,您可以避免在完成处理之前发出几个相同的请求。请注意,期货只有在3.5以后才能买到。

你也可以看到为什么这个任务要花这么长时间。如果计算量很大,那就无法避免;但是如果创业很重(这通常是我在做这种事情时的经验。)在这种情况下,将其他可执行文件包装到具有循环并能够通信(最容易的是web服务)的东西中是非常有用的。这让您有真正的每一个请求的成本,完全避免了启动成本,通过为每个请求生成一个新的子进程。

票数 1
EN

Stack Overflow用户

发布于 2019-07-08 06:25:01

您可以使用多处理并行启动函数,然后使用multiprocessing.Queue在进程之间保持缓存同步。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56929258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档