从前端使用 AJAX 查询 Celery 以了解创建的任务是不是完成的最佳方法?

Posted

技术标签:

【中文标题】从前端使用 AJAX 查询 Celery 以了解创建的任务是不是完成的最佳方法?【英文标题】:Best way to query Celery using AJAX from front-end to know if a created task is completed or not?从前端使用 AJAX 查询 Celery 以了解创建的任务是否完成的最佳方法? 【发布时间】:2011-06-18 07:12:45 【问题描述】:

我正在使用 Django 和 Celery + RabbitMQ 来创建用户上传的视频的视频转换任务。 Now I know how to query celery to get the status.我的问题是在哪里保存与每个任务关联的task_id,我应该将它保存在模型中还是django的缓存中?

我知道过去有人问过类似的问题,例如this *** question 但目前还没有明确的答案。我知道这个问题的答案因开发人员的喜好而异,但如果有人可以就不同方法的优缺点进行教育,那就太好了。

重申一下,我将使用 task_id 每隔一段时间从前端触发 AJAX 查询,以了解视频转换是否完成。

【问题讨论】:

【参考方案1】:

如果您安装了django_celery,则可以查询task_statusis_task_successfuldjcelery.views 包中的视图。它们返回一个 JSON 字典,因此您可以使用 javascript 处理它们。

【讨论】:

我认为我的问题更多地与“如何跟踪为哪个 model.object 创建了哪个任务?”有关。所以例如我可以转到 djcelery.views 但我不知道哪个“任务”与哪个“task_creator”相关。为了解决这个问题,我选择了上面的@crodjer 答案。【参考方案2】:

请参阅我对您的链接问题的回答:Test if a celery task is still being processed

因此,在设置 celery_task 字段后,您可以轻松定义一个 ajax 视图,该视图将以所需格式返回任务状态。

【讨论】:

是的,听起来不错。只是出于好奇,考虑到我们将只使用一次任务,就在我们将进行视频转换而不是以后的任何时候,将“celery_task”保存到模型中是否是一个好的设计。我的意思是我们只会在模型中使用该信息大约一两次。但我想这是唯一理智的解决方案? 我还可以使用 JSON 代替 PickledObjectField() 吗?另外,您的意思是 django-picklefield 的 PickledObjectField 实现。对吗? 实际上我在我的编码竞赛项目中为分布式计算实现了它。因此,在这种情况下,代码的结果、编译状态保存在任务中,因此它是未来查找所必需的。使用 JSON 时如何监控任务。我的意思是您需要将 celery 任务结果对象保存在字段中,以便将来检查状态的方法可用。 其实我只需要task_id,在我创建任务的那一刻我就可以得到,dpaste.com/371454我总是可以得到状态,dpaste.com/370419

以上是关于从前端使用 AJAX 查询 Celery 以了解创建的任务是不是完成的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

前端随心记---------Ajax,Comet,Websocket

从 AJAX 请求调用 django 视图(解析 celery task_id)

使用AJAX根据下拉框返回查询结果

高级前端:详解手写原生Ajax的实现

猿创征文|一文带你了解前端开发者工具

如何在加载时显示进度条,使用ajax