Python Celery 任务状态
我在想,部署到工作者后,有什么方法可以通过浏览器监控celery任务呢?
我现在的应用程序架构是一个在twisted中运行的flask应用,使用celery来处理数十到数千个小的后台任务(比如更新仓库中的元数据、创建图像衍生品等)。我想用ajax长轮询的方式来监控用户发起的celery任务的状态。
我看到celery有一些命令行的方式来监控任务,或者可以使用flower来查看网页仪表盘。但是如果我想查看某个特定任务的更详细状态,是否更合理让这个任务打印或写入一个日志文件,然后从flask前端长轮询这个文件的变化呢?
目前,用户可以说“更新这10,000个项目”,任务会被发送到celery,前端会很快显示“任务已发送!”。这些任务确实会完成。但我希望用户能导航到“/status”页面,查看这10,000个小任务的状态——即使是一个滚动的日志文件也可能有效。
任何建议都非常感谢。我花了很多时间来构思这些内容,但现在在弄清楚到底要从用户前端长轮询什么方面感到困惑。
2 个回答
5
试试 Jobtastic,它是对 Celery 的扩展。
根据项目描述:
Jobtastic 提供了一些很不错的功能,比如:
- 轻松估算和报告进度
- 任务状态反馈
- 一些辅助方法,可以优雅地处理任务代理崩溃的情况(比如 delay_or_eager 和 delay_or_fail)
- 超级简单的结果缓存
- 避免“雷鸣般的群体”问题
- 与一个 Celery 的 jQuery 插件集成,方便在客户端显示进度
- 在任务运行中检测内存泄漏
1
Jobtastic这个想法挺不错,但对我们来说并不完全合适。最后,我们决定创建一个递增的工作编号(这个编号和结果、消息代理一起存储在Redis里),把所有和这个工作编号相关的celery任务ID放进一个Python对象里,然后把这个对象进行序列化(也就是把它转换成一种可以存储的格式),再存到Redis里。这样我们就可以在后面查看这个“工作”是否完成,或者它的状态如何。对我们来说,这样做非常好用。