【问题标题】:How to use the .delay() method in django-celery?如何在 django-celery 中使用 .delay() 方法?
【发布时间】:2014-04-04 12:05:59
【问题描述】:

我想使用 .delay 来实现异步行为。使用它的主要原因是加快我的视野。我做错了吗?如果是这样,我应该怎么做?

下面是示例代码:

查看.py

@cache_page(60*60*24)
def my_view(request):
    something ..... .... ....
    a = SomeModel.objects.get(pk=id)
    data = celery_task.delay(a)
    return dumpjson(status='ok', data=data, callback=callback)

任务.py

def celery_task(a):
    res = request.get('http:sample.sample.com/feed/result' params={'abc': 'abc'})
    return {'response': res}

如果我从 celery_task 带来响应,它会显示一些 guid (1b52f519-64cb-43da-844a-2886bcccb9bc),错误是这样的:

<EagerResult: 1b52f519-64cb-43da-844a-2886bcccb9bc> is not JSON serializable

【问题讨论】:

    标签: python django celery django-celery


    【解决方案1】:

    您正在延迟函数并异步调用它。因此,不可避免地,您的代码不会等到它得到结果。这就是重点。

    所以 Celery 将开始在后台运行celery_task,您将不得不在不知道结果将是什么的情况下向客户端返回一些内容。也许如果任务完成它可以将数据保存到数据库中,并且下次用户进入页面时,您可以显示数据库中的完成数据。或者别的什么。

    你从.delay 得到的是一种后台任务的句柄。你可以在它上面调用.get()(如果我没记错的话),它会一直挂起,直到它得到返回值,然后你又回到同步调用函数。

    【讨论】:

    • 是的。就我而言,我没有将某些内容保存到数据库中。我使用它的返回值作为响应。你是对的,我的代码不会等到它有结果。所以我使用了 .wait() 它对我有用。这是最好的方法吗?顺便说一句,我的响应速度提高了 50%。
    • 也许如果运行 Celery 的服务器比您的 Web 服务器快得多,但通常等待结果并不是您使用 Celery 的原因。
    • 那我需要用什么?
    • 如果您不希望任务异步运行,您应该直接调用。使用 Celery 时会有一些开销,这意味着将其作为任务运行并等待结果将比仅调用执行相同操作的常规函数​​慢。
    • 其实我想异步运行任务。任务包括与第三方的外部连接。我想让这个任务与其他进程并行运行。
    【解决方案2】:

    您将不会延迟获取返回的数据,除了任务 id 而是使用http://docs.celeryproject.org/en/master/userguide/remote-tasks.html#enabling-the-http-task

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-14
      • 2015-11-09
      • 2020-12-08
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2013-08-30
      • 2017-02-13
      相关资源
      最近更新 更多