Celery 和 Django - 主进程是否等待任务完成?

问题描述 投票:0回答:1

我刚刚开始开发一个使用 Django 和 Celery 的项目。我对两者都很陌生。其中一个端点的代码如下所示:

task_do_something.delay()
return Response(
            {"success": True},
            status=status.HTTP_200_OK
        )

task_do_something
是一项需要一段时间才能完成的任务。 (它不会调用任何其他 Celery 任务。)Celery 将任务排队后主进程会立即执行 return 语句吗?还是会等待任务完成后再继续下一行?

通读文档,我倾向于认为答案是第一个选项(任务排队后执行下一条语句),因为 Celery 任务是异步的。但我想再确认一下。

django celery django-celery celery-task djcelery
1个回答
0
投票

使用 Django 和 Celery 时,了解如何处理异步任务对于创建高效且实用的 Web 应用程序至关重要。让我们更深入地了解 Celery 任务的操作以及它们如何与主 Django 系统交互。

在您的场景中,您有一个 Django 视图端点,它使用delay() 对 Celery 任务task_do_something 进行排队,然后立即向客户端返回响应。您关心的是 Django 主进程是否会等待作业完成后再进入下一行,还是在作业队列之后立即继续执行

Celery 任务本质上是真正的异步,这意味着当您调用delay() 或 apply_async() 时,任务将被添加到 celery 连接中,主程序流程将继续执行,而不等待任务完成,而是 celery 执行任务处理以独立的申请流程为主。

所以在你的情况下,主要的 django 任务不会等到 task_do_something 完成。它执行下一行代码,这是一个返回语句,以成功状态响应客户端。

这种行为对于 Web 应用程序很有用,因为即使在后台有很长的作业需要完成,它也能让主 django 服务器响应传入的请求。通过将这些作业迁移到 celery,您基本上可以阻止服务器并确保更轻松的用户体验。

但是,需要注意的是,由于 django 主进程将作业排队并继续执行,客户端可能不会立即收到表明作业已完成的响应。如果需要在作业完成时通知客户端,您有进行任何民意调查或。

© www.soinside.com 2019 - 2024. All rights reserved.