我的django web-app逻辑主要面向后台任务执行(包括周期性的,独立的,同步的以及异步的) . 所有研究似乎都指出使用芹菜是最推荐的方法 . 我计划最终部署在Heroku上,而且它支持Celery Redis(我用于本地开发)对我来说是一个很大的优势 .
但是,我需要比芹菜提供的更广泛的调度功能 . 我需要一些我的周期性任务才能运行时间表,例如“在当月的最后一个太阳上运行”等 . 所以我在django中实现了我自己的模型来存储重复规则和其他所需的参数 .
现在我对如何将我的 table 与芹菜接口感到难过 . 理想情况下,我想要做的是拥有自己的Job模型,该模型具有日程安排,应该在到期时运行的任务以及任务的参数 . 类似于C中的函数ptr . 然后我会运行一个守护进程,它不断检查作业已到期的作业队列,如果它定期创建下一个作业实例并将其推入队列,然后使用celery的延迟方法或类似方法运行带有参数的相关任务 .
问题:
-
这种方法是否有意义?
-
如果没有,我可以使用其他替代方法
-
如果是,我该如何设计该作业/事件队列...
我希望能够听到更好的方法来实现这一目标,或者是否存在可能适合的作业队列的现有实现或者使用芹菜的作业队列本身的方法......
谢谢堆..
1 回答
Celery的周期性任务非常类似于此 . 有一个专用的调度程序进程(
celery beat
),它只是在到期时发送任务 .您还可以通过继承
celery.beat.Scheduler
类来创建与beat
一起使用的新调度程序,并且您也可以通过继承celery.schedules.schedule
来创建自定义调度(如已经内置的crontab
调度) .在django-celery扩展(
djcelery.schedulers.DatabaseScheduler
)中有一个数据库支持的调度程序实现,它使用许多技巧来避免过于频繁地轮询数据库等等(遗憾的是它没有得到很好的评论) .调度程序:https://github.com/celery/celery/tree/master/celery/beat.py schedule:https://github.com/celery/celery/tree/master/celery/schedules.py DatabaseScheduler:https://github.com/celery/django-celery/tree/master/djcelery/schedulers.py