我正在努力将额外的命令行参数转移到芹菜任务。我可以在bootstep
中设置所需的属性,但是当从任务直接访问时,相同的属性是emtpy(我猜它会被覆盖)
class Arguments(bootsteps.Step):
def __init__(self, worker, environment, **options):
ArgumentTask.args = {'environment': environment}
# this works
print ArgumentTask.args
这是自定义任务
class ArgumentTask(Task):
abstract = True
_args = {}
@property
def args(self):
return self._args
@args.setter
def args(self, value):
self._args.update(value)
实际任务
@celery.task(base = ArgumentTask, bind = True, name = 'jobs.send')
def send(self):
# this prints empty dictionary
print self.args
我是否需要使用一些额外的持久层,例如。持久性对象还是我错过了一些非常明显的东西?
答案 0 :(得分:3)
似乎不可能。原因是您的任务可以由队列的任何消费者在任何地方使用,并且每个消费者具有不同的命令行参数,因此它的处理不应该依赖于工作人员配置。
如果您的问题是管理环境dev / prod,这就是我们在项目中管理它的方式:
每个环境都被监禁在具有配置的venv中,以便项目自我意识到它的环境(在我们的例子中,它只是配置中的db链接发生变化)。每个环境都有自己的队列和芹菜工人使用此命令启动:
/path/venv/bin/celery worker -A async.myapp --workdir /path -E -n celery-name@server -Ofair
希望它有所帮助。
如果你真的想深入研究,每个任务都可以访问.control
,它允许在芹菜上启动控制操作(就像一些监控)。但我在那里找不到任何有用的东西。