Задачи хранятся в словаре по ключу. Ключ задается аргументом name
или repr()
аргумента sig
. Здесь аргумент sig
равен task.s()
, и он одинаков для каждого цикла. Поэтому, проходя через цикл, он перезаписывает один и тот же ключ для каждого расписания. Для исправления укажите уникальное имя:
sender.add_periodic_task(crontab(hour=i), task.s(), name='whatever-{}'.format(i))
Вот соответствующий источник из celery
:
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
edit: Как указано @GharianiMohamed состояние документов , что аргумент hour
chrontab
может быть " a (список) целых чисел от 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())