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

Python 如何在多个进程之间共享缓存?,python,multiprocessing,Python,Multiprocessing,我用它来加速一些相当繁重的处理。它运行良好,大大加快了速度。然而 当我使用多进程时,每个进程都会创建自己的单独缓存,并且同一事物有8个副本。这似乎不是一个问题,直到盒子内存耗尽,导致坏事情发生 理想情况下,我只需要一个大约300个项目的缓存大小的应用程序,1*300将适合我的7GB工作,但8*300只是不适合 如何让所有进程共享同一缓存?我相信您可以使用管理器在进程之间共享dict。理论上,这应该允许对所有函数使用相同的缓存 但是,我认为更合理的逻辑是,有一个进程通过在缓存中查找查询来响应查询,

我用它来加速一些相当繁重的处理。它运行良好,大大加快了速度。然而

当我使用多进程时,每个进程都会创建自己的单独缓存,并且同一事物有8个副本。这似乎不是一个问题,直到盒子内存耗尽,导致坏事情发生

理想情况下,我只需要一个大约300个项目的缓存大小的应用程序,1*300将适合我的7GB工作,但8*300只是不适合


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

我相信您可以使用
管理器在进程之间共享dict。理论上,这应该允许对所有函数使用相同的缓存

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

with concurrent.futures.ProcessPoolExecutor() as e:
    @functools.lru_cache
    def work(*args, **kwargs):
        return e.submit(slow_work, *args, **kwargs)
请注意,
work
将返回消费者必须等待的
Future
对象。
lru\u缓存
将缓存未来的对象,因此它们将自动返回;我相信您可以多次访问他们的数据,但现在无法对其进行测试


如果不使用Python 3,则必须安装
concurrent.futures
functools.lru\u cache

的后端口版本,将共享缓存传递给每个进程。父进程可以实例化单个缓存,并将其作为参数引用到每个进程

@utils.lru_cache(maxsize=300)
def get_stuff(key):
    """This is the routine that does the stuff which can be cached.
    """
    return Stuff(key)

def process(stuff_obj):
    """This is the routine which multiple processes call to do work with that Stuff
    """
    # get_stuff(key) <-- Wrong; I was calling the cache from here
    stuff_obj.execute()

def iterate_stuff(keys):
    """This generates work for the processses.
    """
    for key in keys:
        yield get_stuff(key)  # <-- I can call the cache from the parent

def main():
    ...
    keys = get_list_of_keys()
    for result in pool.imap(process, iterate_stuff(keys)):
         evaluate(result)
    ...

Katriel让我走上了正确的道路,我会实现这个答案,但是,愚蠢的我,我的错误甚至比他建议的更容易解决。

Python
多处理模块有一个关于的部分。进程外缓存对你来说是一个选项吗?你能在缓存状态下使用pickle并将其存储在redis中吗?@sam确实,似乎
管理器
可以共享一个
dict
,我怀疑是lfu缓存在内部。我想我希望以前有人把它砍掉以适应这个问题,这样我就不必了;-)@我很喜欢你的想法,但它的强度很高(每毫秒数千次),所以提到酸洗,我马上就预断它太慢了。有没有办法通过gunicorn+Battle启动的不同进程来实现这一点?只有当
获取东西(键)
返回小对象时,这才会提高性能,将大型对象传递给子进程将花费很长时间。
        yield (key, get_stuff)