Python Celery将命令行参数传输到任务
我正在努力将额外的命令行参数转移到芹菜任务。我可以在Python Celery将命令行参数传输到任务,python,persistence,celery,celery-task,Python,Persistence,Celery,Celery Task,我正在努力将额外的命令行参数转移到芹菜任务。我可以在bootstep中设置所需的属性,但是当直接从任务访问时,相同的属性是emtpy(我猜它会被覆盖) 这是自定义任务 class ArgumentTask(Task): abstract = True _args = {} @property def args(self): return self._args @args.setter def args(self, value): self._args
bootstep
中设置所需的属性,但是当直接从任务访问时,相同的属性是emtpy(我猜它会被覆盖)
这是自定义任务
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
我是否需要使用一些额外的持久性层,例如持久性对象,或者我缺少了一些非常明显的东西
这似乎是不可能的。这样做的原因是,您的任务可能被队列的任何使用者和具有不同命令行参数的每个使用者在任何地方使用,因此它的处理不应依赖于工作人员配置 如果您的问题是管理环境dev/prod,那么这就是我们在项目中管理环境dev/prod的方式: 每个环境都被囚禁在其具有配置的venv中,以便项目能够自我意识到其环境(在我们的例子中,更改的只是配置中的db链接)。每个环境都有它的队列和芹菜工人,通过以下命令启动:
/path/venv/bin/celery worker -A async.myapp --workdir /path -E -n celery-name@server -Ofair
希望有帮助
如果你真的想深入研究,每个任务都可以访问一个
.control
,它允许对芹菜启动控制操作(比如一些监控)。但是我没有发现任何有用的东西。我想这适用于任务之间的持久对象不可能?例如,如果我在自定义任务中设置了一些属性,然后执行了一系列任务,他们就不会设置该属性。是吗?同样的道理。任何要从一个任务跳到另一个任务的内容都必须序列化,并与下一个要作为参数执行的任务一起放入队列,或者必须在数据库中持久化。我做这类事情的方式是在我的对象中持久化元数据(在mongodb中就是这样),并放置标签(“任务X开始/结束”),我很害怕。。。我将不得不重新考虑一些事情。谢谢
/path/venv/bin/celery worker -A async.myapp --workdir /path -E -n celery-name@server -Ofair