如何在多个进程之间共享缓存?

Joh*_*Mee 11 python multiprocessing

我正在使用LRU缓存来加速一些相当繁重的处理.它运作良好,可以大大加快速度.然而...

当我进行多处理时,每个进程都创建它自己的独立缓存,并且有8个相同的副本.这似乎不是一个问题,直到盒子耗尽内存并且结果发生了不好的事情......

理想情况下,我只需要一个大约300个项目的cachesize为应用程序,1*300将适合我必须使用的7GB,但8*300只是不适合.

如何让所有进程共享相同的缓存?

Kat*_*iel 8

我相信你可以使用a Manager在进程之间共享一个dict.从理论上讲,这应该允许您为所有功能使用相同的缓存.

但是,我认为更合理的逻辑是让一个进程通过在缓存中查找它们来响应查询,如果它们不存在,则将工作委托给子进程,并在返回之前缓存结果.你可以很容易地做到这一点

with concurrent.futures.ProcessPoolExecutor() as e:
    @functools.lru_cache
    def work(*args, **kwargs):
        return e.submit(slow_work, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

请注意,work将返回Future消费者必须等待的对象.在lru_cache将高速缓存,使他们将自动返回未来的对象; 我相信您可以多次访问他们的数据,但现在无法测试它.

如果您不使用Python 3,则必须安装concurrent.futures和的后向移植版本functools.lru_cache.