我有一个用Python编写的数据处理程序,它需要在一个阶段调用外部程序。分析表明,大约50%的总处理时间是在这一阶段。
我有一台多核的计算机,所以并行似乎是解决方案。问题是,这个电话是回忆录的:
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倍。
发布于 2019-07-08 06:22:33
您可以异步启动任务,然后将未来放入备忘录中。任何询问备忘录结果的人都会遇到三种状态中的一种:没有备忘(因此启动一个新的昂贵的外部处理任务)、未完成的未来备忘录(您可以等待它,或者承认它尚未完成并在完成之前去做其他事情),或者完成未来的备忘(结果立即可用)。这样,您可以避免在完成处理之前发出几个相同的请求。请注意,期货只有在3.5以后才能买到。
你也可以看到为什么这个任务要花这么长时间。如果计算量很大,那就无法避免;但是如果创业很重(这通常是我在做这种事情时的经验。)在这种情况下,将其他可执行文件包装到具有循环并能够通信(最容易的是web服务)的东西中是非常有用的。这让您有真正的每一个请求的成本,完全避免了启动成本,通过为每个请求生成一个新的子进程。
发布于 2019-07-08 06:25:01
您可以使用多处理并行启动函数,然后使用multiprocessing.Queue在进程之间保持缓存同步。
https://stackoverflow.com/questions/56929258
复制相似问题