【问题标题】:Share memory areas between celery workers on one machine在一台机器上的芹菜工人之间共享内存区域
【发布时间】:2012-03-22 20:37:52
【问题描述】:

我想在 celery 中的工作节点之间共享少量信息(例如缓存的授权令牌、统计信息等)。

如果我在我的任务文件中创建一个全局变量,那么它对于每个工作人员都是唯一的(我的工作人员是进程,并且生命周期为 1 个任务/执行)。

最佳做法是什么? 我应该在外部(DB)保存状态,创建一个老式的共享内存(由于 celery 中不同的池实现可能很困难)?

提前致谢!

【问题讨论】:

  • 像 memcached 这样的缓存,或者像 Redis 这样的键值存储呢?
  • 那是一种方法,但我希望我能找到一种方法,而不需要额外的依赖。
  • 它的依赖很小,但它会解决您在实现自己的进程间通信时可能遇到的一些问题。

标签: python shared-memory celeryd


【解决方案1】:

终于找到了一个不错的解决方案——core python multiprocessing-Manager:

from multiprocessing import Manager
manag = Manager()
serviceLock = manag.Lock()
serviceStatusDict = manag.dict()

每个进程都可以访问这个字典,它是同步的,但是在同时访问它时必须使用锁(就像在其他所有共享内存实现中一样)。

【讨论】:

  • 嗨 Gregor,我很高兴就我面临的这个问题发表您的意见:stackoverflow.com/questions/26088868/… 您认为您的解决方案适合我的问题吗?非常感谢
  • 嗨,cyberjoac,一般来说这可以工作,但你需要尝试一下 Django 和 Celery 是否生活在同一个进程组中(我对此表示怀疑)。让我知道它是否有效,我很感兴趣!
  • 你在哪里初始化这个管理器?
  • 基本上没关系,@AntonioBeamud - 它需要在为每个进程加载的模块中。
  • 我有 main.py。我有生成报告的 generatereport.py,我在这里添加了字典。多亏了你,所有的工人都可以访问同一个字典。但我无法在我的 mian.py 中访问这本字典。如何实现这一目标。
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多