2015-04-01 3 views
0

У меня есть проект django в сочетании с сельдереем, и моя потребность в том, чтобы иметь возможность планировать задачи динамически, в какой-то момент в будущем, с повторением или нет. Мне нужна возможность удалять/редактировать уже запланированные задачиdjango-сельдерей PeriodicTask и это поле

Итак, чтобы достичь этого в начале я начал использовать Джанго-сельдерей с DatabaseScheduler для хранения некоторых PeriodicTasks (с истечением) в базу данных, как описано более или менее here

Таким образом, если я закрою мое приложение и запустить его снова мои графики все еще там

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

Второй вопрос, мой вопрос заключается в том, могу ли я планировать однократную задачу, например, планировать ее выполнение, например. в 2015-05-15 15:50:00 (вот почему я пытаюсь использовать eta)

Наконец, я планирую несколько тысяч сообщений, является ли сельдерей способным справиться с этим количеством запланированных задач? некоторые из них разовые, а другие - периодические? Или я должен идти с более продвинутым решением, таких как APScheduler

Спасибо вам

+0

Вы не хотите использовать обратный отсчет справа? Не могли бы вы подробнее рассказать о задачах, которые вы хотите выполнить. Я думаю, что у меня нет правильной идеи о том, что вы планируете делать. –

+0

Hi Maximilian и спасибо за ваш интерес. Я немного изменил свой вопрос, чтобы сделать его более понятным – tbo

ответ

0

Я столкнулся с той же проблемой вчера. Мое некрасиво временное решение:

# tasks.py  
from djcelery.models import PeriodicTask, IntervalSchedule 
from datetime import timedelta, datetime 
from django.utils.timezone import now 

... 

@app.task 
def schedule_periodic_task(task='app.tasks.task', task_args=[], task_kwargs={}, 
          interval=(1, 'minute'), expires=now()+timedelta(days=365*100)): 
    PeriodicTask.objects.filter(name=task+str(task_args)+str(task_kwargs)).delete() 
    task = PeriodicTask.objects.create(
     name=task+str(task_args)+str(task_kwargs), task=task, 
     args=str(task_args), 
     kwargs=str(task_kwargs), 
     interval=IntervalSchedule.objects.get_or_create(
      every=interval[0], 
      period=interval[1])[0], 
     expires=expires, 
    ) 
    task.save() 

Так что, если вы хотите запланировать периодическую задачу с ЭТИМ, вы Шоудом

# anywhere.py  
schedule_periodic_task.apply_async(
    kwargs={'task': 'grabber.tasks.grab_events', 
      'task_args': [instance.xbet_id], 'task_kwargs': {}, 
      'interval': (10, 'seconds'), 
      'expires': instance.start + timedelta(hours=3)}, 
    eta=instance.start, 
) 

графиком задачи с ЭТИМ, которая создает периодическую задачу. Гадкий:

  1. сделки с raw.task.name
  2. странный период (п, 'интервал')

Пожалуйста, дайте мне знать, если вы разработаны некоторые довольно решение.

Смежные вопросы