芹菜工人变量共享&在bootstep中初始化

时间:2017-04-27 19:55:07

标签: multiprocessing celery message-queue python-3.4 kombu

我对python 3.4和celery 4.0.2中的进程共享变量有疑问。我已经阅读了帖子(Celery worker variable sharing issues),其中海报的目标是分享变量。

我目前与此问题完全相反:我想在单个工作程序的所有子进程中共享变量。

我的情况如下:

  • 我在我的芹菜工人身上使用prefork(在ubuntu下运行)
  • 我创建了一个bootstep,我从配置服务器检索数据并将dict存储在放置在自己的模块中的全局变量中。 bootstep是一个worker bootstep,它唯一的依赖是timer。我在bootsteps start方法中执行(阻塞)请求。我可以看到它收到了正确的数据
  • 有时它"只是工作"我从工作者子进程中看到了全局变量。有时候它不起作用,变量被初始化但是数据应该在里面的字典是空的
  • 我已经做了一些调试,发现事实上应该保存我的配置字典的对象的id是相同的(这表明在首次访问配置变量后复制了该进程
模块配置中的

config.py

class MyGlobalConfig(object):
    def __init__(self):
        self.data = {}

    def get(key):
        return self.data[key]

global_config = MyGlobalConfig()

bootstep.py

import config

...
global_config.data = response_data
...

从任务访问的some.py

import config

...
global_config.get(key) # NoneType cause global_config.data is empty
...

我不知道为什么它有时会起作用,有时候不起作用。从我所看到的芹菜在工人的靴子完成之后分叉它的子过程 - 理论上我的数据应该在那里。

除了这些启动问题之外,完全有可能在工作者的生命周期内获得配置更新,我也需要将其分发给所有子进程。

在芹菜中最好的方法是什么?到目前为止,我发现的一切都是以工人为中心或利用经纪人。因为它只适用于当地工人的工作,我不想使用任何可能影响其他非本地工人的事情或利用经纪人...

0 个答案:

没有答案