使用ProcessPoolExecutor时如何正确记住?

时间:2019-07-23 00:30:39

标签: python-3.x caching python-multiprocessing memoization process-pool

我怀疑类似:

@memoize
def foo():
    return something_expensive

def main():
    with ProcessPoolExecutor(10) as pool:
        futures = {pool.submit(foo, arg): arg for arg in args}
        for future in concurrent.futures.as_completed(futures):
            arg = futures[future]
            try:
                result = future.result()
            except Exception as e:
                sys.stderr.write("Failed to run foo() on {}\nGot {}\n".format(arg, e))
            else:
                print(result)

由于我使用的是多处理池,并且进程没有太多共享,因此不起作用(假设@memoize是典型的基于dict的缓存)。至少它似乎不起作用。

在这种情况下记忆的正确方法是什么?最终,我还想将缓存整理到磁盘上,并在以后的运行中加载它。

1 个答案:

答案 0 :(得分:0)

您可以使用来自多重处理的Manager.dict,该处理程序使用Manager在进程之间进行代理并存储在共享的dict中,可以对其进行腌制。我决定使用多线程,因为它是一个IO绑定的应用程序,并且线程共享的内存空间意味着我不需要所有管理器内容,我可以只使用字典。