Почему создано только одно периодическое задание? - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу создать несколько периодических задач по циклу, но был создан только последний из списка. Например:

@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())

В расписании задач при запуске сельдерея -A задач - l отладка я вижу только задачу, выполненную в 10 часов. Зачем?

1 Ответ

0 голосов
/ 14 сентября 2018

Задачи хранятся в словаре по ключу. Ключ задается аргументом 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...