我如何将回忆的呼叫并行与外部程序相关



我有一个用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的经验使我对种族条件的警惕损害了缓存。

最好,最柔软的方法是使处理的这一阶段并行?我想将记忆保持在适当的位置,因为将其删除增加了四倍。

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

您还可以看到为什么任务花了这么长时间。如果计算很重,那就不可能了。但是,如果启动很重(这通常是我做这样的事情时的经验。在这种情况下,将另一个可执行文件包裹成具有循环并可以交流的东西非常有用(大多数很容易,一个网络服务(。这使您可以拥有真正的每次要求成本,从而完全避免通过为每个请求产生新的子过程所获得的启动成本。

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

最新更新