在所有Celery工作进程中全局可访问的对象/ Django中的内存缓存

8 投票
3 回答
4280 浏览
提问于 2025-04-15 20:45

我有一个比较标准的Django+Rabbitmq+Celery的设置,里面有一个Celery任务和五个工作进程。

这个任务是将同一个(我稍微简化一下)大文件(大约100MB)异步上传到多个远程电脑。

一切运行得很好,但代价是消耗了大量内存,因为每个任务和工作进程都要单独把这个大文件加载到内存中。

我想做的是有一个可以被所有任务访问的缓存,也就是说,只加载一次这个文件。Django的基于本地内存的缓存是最理想的,但正如文档所说:“每个进程都会有自己私有的缓存实例”,而我需要这个缓存能被所有工作进程共享。

我尝试过使用Celery信号,像在#2129820中描述的那样,但这不是我需要的。

所以问题是:有没有办法在Celery中定义一些全局的东西(比如一个基于字典的类,我可以在里面加载文件或其他东西)。或者在这种情况下,有没有Django的技巧可以使用?

谢谢。

3 个回答

0

也许你可以用线程来代替进程来完成这个任务。因为线程之间共享同一块内存,所以你只需要在内存中存一份数据,但仍然可以实现并行执行。
(这意味着在这个任务中不需要使用Celery)

1

看起来你需要的是为Django配置一个memcached。这样,Celery中的每个任务都可以访问它。

2

为什么不直接从磁盘流式上传,而不是把整个文件都加载到内存里呢?

撰写回答