Celery 任务调用端点。完成这项工作的是芹菜还是 django 服务器?

Celery task calls endpoint. Is it celery or the django server that does the job?

这是一个我寻求答案的一般性问题,因为我在我公司的代码库中看到一位前员工的 celery 任务。

这是一个调用端点的共享任务,例如

@shared_task(time_limit=60*60)
def celery_task_here(some_args):
    data = get_data(user, url, server_name)
    # some other logic to build csv and stuff

def get_data(user, url, server_name):

    client = APIClient()
    client.force_authenticate(user=user)
    response = client.get(some_url, format='json', SERVER_NAME=server_name)

并且所有逻辑都驻留在该端点中。

现在我的理解是,这将使服务器完成所有工作并且不利用 celery 的优势,但是当我在本地 运行 时,我确实看到 celery 日志产生查询。我想知道在这种情况下谁真正在做这项工作,celery 还是 django 服务器?

如果通过celery_task_here.delay调用任务,任务会被推送到队列中,然后worker负责处理队列的进程会实际执行任务,不是"Django server"。工作进程可能与您的 Django 实例位于同一台机器上,这取决于您的环境。

如果您通过 celery_task_here.s 调用任务(或作为普通函数),任务 执行通过 Django 服务器。

这取决于任务是如何调用的

如果它打算用 apply_asyncdelay 作为 celery 任务调用而不是由 celery worker 进程作为 celery 任务执行

如果你只是将其作为函数调用,你仍然可以将其作为普通函数调用,而无需将其发送到 celery