芹菜和长期运行的任务



我刚刚在youtube上看了一个视频,里面的演讲者提到应该把芹菜设计得短一些。运行几分钟的任务是不好的。

正确吗?我所看到的是,我有一些长时间运行的任务,需要10分钟才能完成。当这类任务被频繁调度时,队列就会被淹没,而没有其他任务被调度。是这个原因吗?

如果是,对于长时间运行的任务应该使用什么?

长时间运行的任务不是很好,但说它们不好绝不合适。处理长时间运行任务的最佳方法是为这些任务创建一个队列,并让它们在单独的worker上运行,然后再运行短任务。

长时间运行任务的问题是,当您在服务器上推送新软件版本时,您必须等待它们。如果您不等待,您的任务可能会运行不兼容的代码,特别是如果您pickle了一些复杂的对象作为参数(强烈建议这样做)。

正如@user2097159所说,将长时间运行的任务保持在专用队列中是一种很好的做法。您应该通过使用"settings"路由来做到这一点。CELERY_ROUTES"更多信息在这里

如果你可以估计一个任务可以运行多长时间,我建议每个任务使用soft_time_limit,你将能够处理它。

这是我今天演讲的要点

扩展基本的Task定义,可选地将任务实例化视为生成器,并在通过生成器的每次迭代时检查TERM或软超时。一般注入一个"状态"。将kwarg插入到支持它的任务中。如果任务是第一次运行,在结果缓存中分配一个新的,否则从结果缓存中查找现有的。

在你的任务中,找出一个可以缩短执行时间的好地方。必要时更新state参数

当控制返回到主任务类时,检查是否有TERM或软超时,如果有,则保存state对象并响应信号

相关内容

  • 没有找到相关文章

最新更新