我只是看a youtube video主持人提到人们应该设计他/她的芹菜。运行几分钟的任务很糟糕。
这是对的吗?我所看到的是,我有一个长期运行的任务,需要10分钟才能完成。当频繁安排这些任务时,队列将被淹没,并且没有其他任务被安排。这是什么原因?
如果是这样,长期运行的任务应该用什么?
答案 0 :(得分:4)
长时间运行的任务并不好,但说它们不好是不合适的。处理长时间运行任务的最佳方法是为这些任务创建一个队列,让它们在一个单独的工作人员上运行,然后在短任务上运行。
答案 1 :(得分:3)
长时间运行的任务的问题是,当您在服务器上推送新的软件版本时,必须等待它们。如果你不等待,你的任务可能会运行可能不兼容的代码,特别是如果你把一些复杂的对象作为参数腌制(强烈反对)。
答案 2 :(得分:2)
正如@ user2097159所说,将长时间运行的任务保留在专用队列中是一种很好的做法。您应该使用“settings.CELERY_ROUTES”more info here
进行路由如果您可以估算任务的运行时长,我建议您按任务使用soft_time_limit,您将能够处理它。
我给出了here
的演讲答案 3 :(得分:1)
扩充基本Task
定义以有选择地将任务实例化视为生成器,并在通过生成器的每次迭代时检查TERM或软超时。一般地注入一个状态"将kwarg变成支持它的任务。如果是第一次运行任务,请在结果缓存中分配一个新的,否则从结果缓存中查找现有的一个。
在你的任务中,找出一个好的地方,可以缩短执行时间。根据需要更新state
参数。
当控制返回主任务类时,检查TERM或软超时,如果有,则保存state
对象并响应信号。