我有一个与芹菜相结合的django项目,我的需求是能够在未来的某个时刻动态调度任务,无论是否重复。我需要删除/编辑已经安排的任务的能力
因此,为了在一开始实现这一点,我开始使用带有DatabaseScheduler的django-celey将一些PeriodicTasks(过期)存储到数据库中,正如这里或多或少描述的那样
通过这种方式,如果我关闭我的应用程序并重新启动它,我的时间表仍然存在
但我的问题仍然存在,因为我无法利用eta并在未来的某个时候安排任务。是否可以以某种方式使用eta动态调度任务?
我的第二个问题是,我是否可以安排一个一次性任务,比如安排它在2015-05-15 15:50:00运行(这就是我尝试使用eta的原因)
最后,我将安排数千个通知,芹菜节拍能够处理这么多安排的任务吗?其中一些是一次性的,而另一些是周期性的?还是我必须使用更高级的解决方案,如APScheduler
感谢
我昨天也遇到了同样的问题。我丑陋的临时解决方案是:
# 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调度任务,创建周期性任务。丑陋:
- 处理raw.task.name
- 奇异周期(n,"间隔")
如果你设计了一些漂亮的解决方案,请告诉我。