Celery将命令行参数传递给Task

时间:2014-12-11 13:04:16

标签: python persistence celery celery-task

我正在努力将额外的命令行参数转移到芹菜任务。我可以在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

我是否需要使用一些额外的持久层,例如。持久性对象还是我错过了一些非常明显的东西?

  

Similar question

1 个答案:

答案 0 :(得分:3)

似乎不可能。原因是您的任务可以由队列的任何消费者在任何地方使用,并且每个消费者具有不同的命令行参数,因此它的处理不应该依赖于工作人员配置。

如果您的问题是管理环境dev / prod,这就是我们在项目中管理它的方式:

每个环境都被监禁在具有配置的venv中,以便项目自我意识到它的环境(在我们的例子中,它只是配置中的db链接发生变化)。每个环境都有自己的队列和芹菜工人使用此命令启动:

/path/venv/bin/celery worker -A async.myapp --workdir /path -E -n celery-name@server -Ofair

希望它有所帮助。

如果你真的想深入研究,每个任务都可以访问.control,它允许在芹菜上启动控制操作(就像一些监控)。但我在那里找不到任何有用的东西。