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