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

时间:2014-03-03 12:27:47

标签: python django celery django-celery

我想使用.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

2 个答案:

答案 0 :(得分:7)

你正在推迟该功能并异步调用它。因此,不可避免地,您的代码不会等到它有结果。这就是重点。

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

.delay获得的内容是后台任务的一种处理方式。你可以在它上面调用.get()(如果我没记错的话),它将一直挂起,直到它获得返回值,但是你又回到同步调用函数。

答案 1 :(得分:-1)

除了任务ID而不是http://docs.celeryproject.org/en/master/userguide/remote-tasks.html#enabling-the-http-task

,您将无法获得延迟返回的数据