我有非常标准的Django + Rabbitmq + Celery设置,包含1个Celery任务和5个工作人员。
任务将相同的(我简化一点)大文件(~100MB)异步上传到多台远程PC。
所有工作正常,但代价是使用大量内存,因为每个任务/工作人员都会将大文件单独加载到内存中。
我想要做的是拥有某种缓存,可以访问所有任务,即只加载一次文件。基于locmem的Django缓存是完美的,但是文档说:“每个进程都有自己的私有缓存实例”,我需要所有工作者都可以访问这个缓存。
尝试使用#2129820中描述的Celery信号,但这不是我需要的。
所以问题是:有没有办法可以在Celery中定义全局内容(就像基于dict的类,我可以在其中加载文件或smth)。或者在这种情况下我可以使用Django技巧吗?
感谢。
答案 0 :(得分:2)
为什么不简单地从磁盘上传输上传而不是将整个文件加载到内存中?
答案 1 :(得分:1)
在我看来,你需要的是memcached支持django。这样Celery中的每个任务都可以访问它。
答案 2 :(得分:0)
也许您可以为此特定任务使用线程而不是进程。由于线程都共享相同的内存,因此内存中只需要一份数据副本,但仍然可以并行执行。 (这意味着不使用Celery执行此任务)