python - celery beat 调度如何运行期间动态添加任务?
问题描述
我尝试过django-celery-beat,在admin后台添加任务,可以实现动态添加任务但要重启celery beat才生效,请问,有其他方试吗?
问题解答
回答1:无法动态添加,必须重启 beat。
ask 回答过原因了 #3493
回答2:有个思路,你可以考虑,我目前也在尝试这个方法,处于摸石过河阶段。celery是支持定时任务,但是不符合我的需求,我需要像linux下的crontab这样动态添加定时任务,我也看了django-celery-beat,因为用的是Flask,发现不值得参考实现,所以一直在看文档搜资料,终于被我找到一种方式,celery的apply_async这个函数非常有用,它有个eta参数,它的简化使用是countdown,但是eta的威力是很巨大的,因为它只接受datetime对象,比如你给定一个任务在2017-05-02 20:0:0执行,你可以这样使用:
job.apply_async(args=args, kwarg=kwargs, eta=datetime(2017,5,2,20,0,0))
是不是很少用,假如我有一个任务需要每天晚上八点执行,我可以利用这个eta参数实现。伪代码如下:
时间规则 = ’每天晚上八点执行’第一次调用任务,先计算最近的执行时间,作为eta的参数,调用apply_async函数,然后第一次任务执行成功,得到上次任务的eta参数值,在天的值上加一,然后把新的执行时间作为eta的参数再次调用apply_async函数,这里省略了很多判断,自行脑补。循环往复,是不是一直按每天晚上八点执行。
这里有个非常重要的点是如何在任务执行成功的时候计算下一次的执行时间,做法如下
class MyTask(Task): def on_success(self, retval, task_id, args, kwargs):print ’task done: {0}’.format(retval)return super(MyTask, self).on_success(retval, task_id, args, kwargs) def on_failure(self, exc, task_id, args, kwargs, einfo):print ’task fail, reason: {0}’.format(exc)return super(MyTask, self).on_failure(exc, task_id, args, kwargs, einfo)@app.task(base=MyTask)def add(x, y): return x + y
它提供了任务执行成功和失败的函数,我们只要在此基础上重写就可以了,我说的只是最核心的部分,具体怎么做有很多方法,
相关文章:
1. mongodb - windows7下mongod无法正常启动2. 修改mysql配置文件的默认字符集重启后依然不生效3. php - 类似Apple官网顶部3级导航该如何设计数据库?4. docker容器呢SSH为什么连不通呢?5. MySQL视图count速度优化6. mysql - 请教一个Java做数据库缓存的问题7. Python两个list互换,两种不同的操作结果有差异,原因是什么呢?8. 请问一下各位老鸟 我一直在学习独孤九贱 现在是在tp5 今天发现 这个系列视频没有实战9. angular.js - 关于指令link 中的创建变量问题10. javascript - ueditor引入报错问题

网公网安备