Может ли сельдерей, сельдерей и джанго-сельдерей-бить динамически добавлять/удалять задачи во время выполнения без перезапуска celerybeat?

Я попробовал все, что мог, включая:

StackOverflow

Как динамически добавлять/удалять периодические задания на сельдерей (celerybeat)

Может ли сельдерей сельдерей динамически добавлять/удалять задачи во время выполнения?

Проблема Github

Как динамически добавлять или удалять задачи для celerybeat?

Что я получил от выше, если я использую только сельдерей и сельдерей, я должен перезапустить бит сельдерея после добавления/удаления задач. Но мне не нужно перезапускать его, если я объединю django-celery-beat.

Я следую за docs шаг за шагом:

from celery import Celery
from celery.schedules import crontab

app = Celery('tasks')
app.config_from_object('celeryconfig')
app.conf.timezone = 'UTC'

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)

Мой celeryconfig

BROKER_URL = 'amqp://rabbit'
CELERY_RESULT_BACKEND = 'rpc://rabbit'
CELERY_RESULT_PERSISTENT = True
# CELERY_ACKS_LATE = True
CELERY_DEFAULT_DELIVERY_MODE = 2
CELERY_TASK_RESULT_EXPIRES = 3600
CELERYBEAT_SCHEDULER ="django_celery_beat.schedulers:DatabaseScheduler"

Моя команда выполнения билатела

celery -A tasks beat -l info -S django

Это хорошо работает. Задачи выполняются как ожидалось. После этого я написал script для добавления задач во время выполнения

import django
django.setup()
from tasks import app, setup_periodic_tasks
from django_celery_beat.models import PeriodicTask, CrontabSchedule


crontab = CrontabSchedule.objects.create(
       minute='*/1',
       hour='*',
       day_of_week='*',
   )

period = PeriodicTask.objects.create(
       name='testfasd',
       kwargs={},
       crontab=crontab,
       task='tasks.test',
   )

setup_periodic_tasks(app)

Когда я взглянул на базу данных, я получил то, что, как я ожидал, обновил новую запись, а также поле last_update. И журналы в сельдерее также доказали, что

[2016-12-20 17:37:21,796: INFO/MainProcess] Writing entries...
[2016-12-20 17:37:21,840: INFO/MainProcess] Scheduler: Sending due task add every 10 (tasks.test)
[2016-12-20 17:37:31,848: INFO/MainProcess] DatabaseScheduler: Schedule changed.
[2016-12-20 17:37:31,851: INFO/MainProcess] Writing entries...
[2016-12-20 17:37:31,930: INFO/MainProcess] Scheduler: Sending due task add every 10 (tasks.test)

Мой вопрос заключается в том, что, несмотря на то, что бит сельдерея знает, что база данных изменилась, но она по-прежнему отправляет старые задачи и не отправляет новую задачу работнику. Любая идея?

Update

Я использую докер для моего проекта, возможно, он связан.

Ответ 1

Этот вопрос github

[В настоящее время вы не можете добавлять или удалять задачи в celerybeat], вам нужно перезапустить бит.

Нет. Чтобы обновить задачи или время задания внутри сельдерея [beat], вы должны перезапустить экземпляр celery [beat]. Задачи загружаются в память во время выполнения. Чтобы изменить/добавить задачу, вы должны обновить экземпляр.

Вы можете использовать самозапускаемые задачи, используя пользовательские тайминги и условное выполнение. Пример:

from datetime import timedelta
from celery import shared_task

@shared_task
def check_conditions():
    # Do some db-level code
    if condition:
        check_conditions.apply_async(eta=timedelta(hours=6))

Я использую это в производстве и хорошо работает.

Если вам нужно перезагрузить задачи, просто программно перезапустите celery [beat]:

@shared_task
def autoreload():
    if condition:
        execute_shell_code_to_restart_celery()

Я не использовал это и не могу ручаться за его удобство использования, но теоретически должен работать.

Эта проблема github

Мне нужно перезагрузить бит, чтобы обновить эти изменения на рабочем столе... используя django-celery-beat... Эта проблема все еще присутствует на 4.0.2 и на master, проверена [21 декабря 2016 года].