запускать задачи сельдерея в случайное время

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

 "my_task": {
     "task": "path.to.my_task",
     "schedule": crontab(minute='*/%s' % rand),
 },
rand = random(1,12)

но этот код не подходит для моих нужд и более:
1. Мне нужно другое (по возможности со случайным числом0 для каждого арендатора
2. Каждый раз будет генерироваться другое число, а не только при загрузке settings.py (один раз )

Я попытался перезаписать расписание, как описано в ЭТО ответ, но это не сработало, есть ли лучший способ? я что-то пропустил?

(например, в арендаторе А задача будет выполняться в 23 часа и на следующий день в 8, а в арендаторе Б задача будет выполняться в 4 и на следующий день в 20 и т. д.)

Спасибо!

======== обновление ====

после отличного ответа, который я получил, я добавил опцию к своей задаче и обработал ее в методе apply_asynch, как было предложено-
.

"my-task": {  # deprecated task
               "task": "mdm_sync.tasks.test_task",
               # "schedule": new_sc(),
               "schedule": crontab(minute=39, hour=11),
                "options": {
                    "eta": datetime.utcnow()
                }
},


entry.options["eta"] = datetime.datetime.utcnow() + datetime.timedelta(seconds=random(3600,12*3600)

прекрасно работает!


person amichib    schedule 25.09.2016    source источник


Ответы (1)


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

Сначала я делал то же самое, что и вы, используя функцию random, чтобы присвоить значение minute crontab. Но, поскольку settings.py и celery.py загружаются только один раз, когда вы нажимаете python manage.py runserver, эта случайная функция запускается только один раз, и, следовательно, это случайное значение выбирается только один раз, скажем, 5 минут или 7 минут, но затем это случайное значение используется для повторения задачи каждые 5 или 7 минут, что делает задачи периодически повторяющимися.

Итак, что вам нужно сделать, так это то, что вместо определения времени задачи в settings.py или celery.py вам нужно рекурсивно вызвать функцию/метод в вашем tasks.py. Но ключ здесь в том, что вам нужно вызывать одну и ту же функцию рекурсивно и асинхронно, и при асинхронном вызове вам нужно передать параметр delay, значение которого будет вычислено используя случайную функцию

См. мой tasks.py -> https://github.com/ankushrgv/notification/blob/master/apps/notifications/tasks.py

А также

celery.py -> https://github.com/ankushrgv/notification/blob/master/config/celery.py

Вам нужно будет python manage.py shell, а затем вызвать функцию/метод оттуда только один раз, чтобы начать рекурсию.

что-то типа

`myFunction().apply_async()`

В моем случае это было раньше

`CreateNotifications().apply_async()`
person Ankush Raghuvanshi    schedule 25.09.2016
comment
Рад помочь. :) - person Ankush Raghuvanshi; 26.09.2016