1

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

但是,我需要比 celery 提供的更广泛的调度功能。我需要一些定期任务才能运行诸如“在本月最后一个星期日运行”等计划。所以我在 django 中实现了自己的模型来存储重复规则和其他所需参数。

现在我很困惑如何将我的桌子与芹菜连接起来。理想情况下,我想做的是拥有自己的 Job 模型,该模型具有时间表、到期时应运行的任务以及任务的参数。有点像 C++ 中的函数 ptr 。然后我会运行一个守护进程,它会不断检查哪个作业到期的作业队列,如果它定期创建下一个作业实例并将其推送到队列中,然后使用 celery 的延迟方法或类似方法运行带有参数的关联任务。

问题:

  1. 这种方法甚至有意义吗?
  2. 如果不是,我可以使用什么其他替代方法
  3. 如果是的话,我该如何设计那个作业/事件队列......

我很想听听更好的方法来做到这一点,或者是否有可能合适的作业队列的现有实现或使用芹菜作业队列本身的方法......

谢谢大佬。。

4

1 回答 1

0

Celery 中的周期性任务的工作方式与此类似。有一个专用的调度程序进程 ( celery beat),它只是在任务到期时发送任务。

您还可以通过对类进行子类化来创建新的调度程序以供使用,并且您也可以beat通过子celery.beat.Scheduler类化创建自定义调度(如crontab已经内置的调度)celery.schedules.schedule

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

Scheduler: https://github.com/celery/celery/tree/master/celery/beat.py schedules: https://github.com/celery/celery/tree/master/celery/schedules.py DatabaseScheduler: https://github.com/celery/django-celery/tree/master/djcelery/schedulers.py

于 2012-12-06T16:05:05.050 回答