Django与芹菜接口的工作队列

时间:2012-11-30 05:58:50

标签: django scheduled-tasks celery

我的django web-app逻辑主要面向后台任务执行(包括周期性的,独立的,同步的以及异步的)。所有研究似乎都指出使用芹菜是最推荐的方法。我计划最终部署在Heroku上,并且它支持Celery + Redis(我用于本地开发)对我来说是一个很大的优势。

但是我需要比芹菜提供的更广泛的调度功能。我需要一些我的周期性任务才能运行诸如“在当月的最后一个太阳上运行”等时间表。所以我在django中实现了我自己的模型来存储重复规则和其他所需的参数。

现在我对如何将我的桌子与芹菜接口感到难过。理想情况下,我想要做的是拥有自己的Job模型,该模型具有日程安排,应该在到期时运行的任务以及任务的参数。类似于C ++中的函数ptr。然后我会运行一个守护进程,它不断检查作业已到期的作业队列,如果它定期创建下一个作业实例并将其推入队列,然后使用celery的延迟方法或类似方法运行带有参数的相关任务。

的问题:

  1. 这种方法是否有意义?
  2. 如果没有,我可以使用其他替代方法
  3. 如果是,我该如何设计该作业/活动队列......
  4. 我希望听到一个更好的方法来实现这一目标,或者是否存在可能适合的作业队列的现有实现或者使用芹菜的作业队列本身的方式......

    谢谢你......

1 个答案:

答案 0 :(得分:0)

Celery中的周期性任务非常类似于此。有一个专门的调度程序进程(celery beat),只需在到期时发送任务。

您还可以通过继承beat类来创建要与celery.beat.Scheduler一起使用的新调度程序,并且您也可以创建自定义计划(例如已经内置的crontab计划)通过继承celery.schedules.schedule

django-celery扩展(djcelery.schedulers.DatabaseScheduler)中有一个数据库支持的调度程序实现,它使用许多技巧来避免过于频繁地轮询数据库等等(遗憾的是它没有得到很好的评论)。

计划程序:https://github.com/celery/celery/tree/master/celery/beat.py 时间表:https://github.com/celery/celery/tree/master/celery/schedules.py DatabaseScheduler:https://github.com/celery/django-celery/tree/master/djcelery/schedulers.py