在所有Celery工作进程中全局可访问的对象/ Django中的内存缓存
我有一个比较标准的Django+Rabbitmq+Celery的设置,里面有一个Celery任务和五个工作进程。
这个任务是将同一个(我稍微简化一下)大文件(大约100MB)异步上传到多个远程电脑。
一切运行得很好,但代价是消耗了大量内存,因为每个任务和工作进程都要单独把这个大文件加载到内存中。
我想做的是有一个可以被所有任务访问的缓存,也就是说,只加载一次这个文件。Django的基于本地内存的缓存是最理想的,但正如文档所说:“每个进程都会有自己私有的缓存实例”,而我需要这个缓存能被所有工作进程共享。
我尝试过使用Celery信号,像在#2129820中描述的那样,但这不是我需要的。
所以问题是:有没有办法在Celery中定义一些全局的东西(比如一个基于字典的类,我可以在里面加载文件或其他东西)。或者在这种情况下,有没有Django的技巧可以使用?
谢谢。
3 个回答
0
也许你可以用线程来代替进程来完成这个任务。因为线程之间共享同一块内存,所以你只需要在内存中存一份数据,但仍然可以实现并行执行。
(这意味着在这个任务中不需要使用Celery)
1
看起来你需要的是为Django配置一个memcached。这样,Celery中的每个任务都可以访问它。
2
为什么不直接从磁盘流式上传,而不是把整个文件都加载到内存里呢?