【问题标题】:Why only one periodic task created?为什么只创建一个周期性任务?
【发布时间】:2019-02-19 10:13:55
【问题描述】:

我想通过循环创建多个周期性任务,但只创建了列表的最后一个。例如:

@app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
    a = [1,3,4,7,8,10]
    for i in a:
        sender.add_periodic_task(crontab(hour=i), task.s())

在我运行 celery beat -A tasks -l debug 的任务计划中,我只看到 10 点执行的任务。为什么?

【问题讨论】:

标签: python-3.x celery periodic-task


【解决方案1】:

任务按键存储在字典中。密钥由name 参数或sig 参数的repr() 给出。这里的sig 参数是task.s(),每个循环都是一样的。因此,当它通过循环时,它会为每个计划覆盖相同的键。要修复提供唯一名称:

sender.add_periodic_task(crontab(hour=i), task.s(), name='whatever-{}'.format(i))

这是来自celeryrelevent source

def add_periodic_task(self, schedule, sig,
                      args=(), kwargs=(), name=None, **opts):
    key, entry = self._sig_to_periodic_task_entry( 
        schedule, sig, args, kwargs, name, **opts)
    if self.configured:
        self._add_periodic_task(key, entry)
    else:
        self._pending_periodic_tasks.append((key, entry))

    return key

def _sig_to_periodic_task_entry(self, schedule, sig,
                                args=(), kwargs={}, name=None, **opts):
    sig = (sig.clone(args, kwargs)
           if isinstance(sig, abstract.CallableSignature)
           else self.signature(sig.name, args, kwargs))
    return name or repr(sig), { # <------------------------------- key created here
        'schedule': schedule,
        'task': sig.name,
        'args': sig.args,
        'kwargs': sig.kwargs,
        'options': dict(sig.options, **opts),
    }

def _add_periodic_task(self, key, entry):
    self._conf.beat_schedule[key] = entry # <--------------------- key can be overwritten

编辑: 正如@GharianiMohamed the docs state 所指出的,chrontabhour 参数可以是“0-23 之间的整数(列表),表示应该在一天中的几个小时内执行。”因此,一种更好的处理方法是完全删除循环:

@app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
    a = [1,3,4,7,8,10]
    sender.add_periodic_task(crontab(hour=a), task.s())

【讨论】:

  • 如果我有一个时间对象列表,我想根据具有特定小时和分钟的时间对象添加周期性任务,那么我需要手动添加吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2018-02-28
  • 1970-01-01
  • 2018-12-16
  • 2019-05-25
  • 2021-02-05
  • 1970-01-01
相关资源
最近更新 更多