如何在 django-celery 中使用 .delay() 方法



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

下面是示例代码:

View.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)

Task.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

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

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

您从.delay中返回的是对后台任务的一种句柄。你可以调用它.get()(如果我没记错的话),这将挂起,直到它获得返回值,但随后你又回到同步调用函数。

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

最新更新