【问题标题】:Celery task calls endpoint. Is it celery or the django server that does the job?芹菜任务调用端点。是芹菜还是 django 服务器来完成这项工作?
【发布时间】:2020-05-12 15:08:02
【问题描述】:

这是我寻求回答的一个通用问题,因为我在公司的代码库中看到了一位前员工的 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 服务器?

【问题讨论】:

    标签: django celery


    【解决方案1】:

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

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

    【讨论】:

    • 如果不是由 celery 执行,为什么要调用带有签名的任务
    • @iklinac 如果您需要它在同一上下文中同步执行。
    • 如果它作为函数执行,它会立即执行,无需添加 .s()(签名),因为签名是要延迟的,也就是说在正常的任务调用中使用它们是没有意义的(无论如何我都赞成你的回答)
    • 此特定任务由.delay() 调用。但我更好奇,因为client.get(some_url, format='json', SERVER_NAME=server_name) 实际上是举重者所在的位置。我可以有把握地声称这些工作(比如说,一堆计算)都是在 celery 中完成的?
    • @JChao 是的,它们在 celery 工作进程中完成,因为它被发送到 celery
    【解决方案2】:

    这取决于任务的调用方式

    如果它是用 apply_asyncdelay 作为 celery 任务调用的,那么它会被 celery 工作进程作为 celery 任务执行

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

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2018-09-09
      • 1970-01-01
      • 2012-08-11
      • 2014-12-04
      • 2011-05-31
      • 2016-04-24
      • 2014-07-14
      • 1970-01-01
      相关资源
      最近更新 更多