我有一个与芹菜结合的django项目,我的需求是能够在未来的某个时刻动态安排任务,是否重现。我需要能够删除/编辑已安排的任务
所以为了在开始时实现这一点,我开始使用django-celery和DatabaseScheduler将一些PeriodicTasks(有效期)存储到数据库中,因为它或多或少地描述here
通过这种方式,如果我关闭我的应用程序并再次启动它,我的日程安排仍在那里
我的问题仍然存在,因为我无法利用eta并在将来的某个时间安排任务。有可能以某种方式使用eta动态安排任务吗?
我的第二个问题是我是否可以安排一次性的任务,例如安排它运行,例如在2015-05-15 15:50:00(这就是我尝试使用eta的原因)
最后,我将安排一些通知的thousants,是芹菜节拍能够处理这么多的计划任务?其中一些是一次性的,而另一些是定期的?或者我必须使用更高级的解决方案,例如APScheduler
谢谢
答案 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计划任务,从而创建定期任务。丑:
如果您设计了一些漂亮的解决方案,请告诉我。