首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在django-celery中使用.delay()方法?

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

Stack Overflow用户
提问于 2014-03-03 20:27:47
回答 2查看 16.4K关注 0票数 4

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

以下是示例代码:

View.py

代码语言:javascript
复制
@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

代码语言:javascript
复制
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),错误如下:

代码语言:javascript
复制
<EagerResult: 1b52f519-64cb-43da-844a-2886bcccb9bc> is not JSON serializable
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-04 21:30:14

您正在延迟函数并异步调用它。因此,不可避免的是,您的代码不会等到得到结果。因为这是某种意义上的。

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

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

票数 9
EN

Stack Overflow用户

发布于 2014-03-04 21:25:00

除任务id外,不会返回延迟返回的数据,请使用http://docs.celeryproject.org/en/master/userguide/remote-tasks.html#enabling-the-http-task

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22146814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档