django-celery PeriodicTask和eta field

时间:2015-04-01 12:39:36

标签: celery django-celery celerybeat

我有一个与芹菜结合的django项目,我的需求是能够在未来的某个时刻动态安排任务,是否重现。我需要能够删除/编辑已安排的任务

所以为了在开始时实现这一点,我开始使用django-celery和DatabaseScheduler将一些PeriodicTasks(有效期)存储到数据库中,因为它或多或少地描述here

通过这种方式,如果我关闭我的应用程序并再次启动它,我的日程安排仍在那里

我的问题仍然存在,因为我无法利用eta并在将来的某个时间安排任务。有可能以某种方式使用eta动态安排任务吗?

我的第二个问题是我是否可以安排一次性的任务,例如安排它运行,例如在2015-05-15 15:50:00(这就是我尝试使用eta的原因)

最后,我将安排一些通知的thousants,是芹菜节拍能够处理这么多的计划任务?其中一些是一次性的,而另一些是定期的?或者我必须使用更高级的解决方案,例如APScheduler

谢谢

1 个答案:

答案 0 :(得分: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()

所以,如果你想用eta安排定期任务,你应该

# 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,
)

使用eta计划任务,从而创建定期任务。丑:

  1. 处理raw.task.name
  2. 奇怪的时期(n,'间隔')
  3. 如果您设计了一些漂亮的解决方案,请告诉我。