【问题标题】:how do I delay and get after a return with celery and django?我如何延迟并在用 celery 和 django 返回后获得?
【发布时间】:2018-03-16 12:39:01
【问题描述】:

目前正在尝试清理 celery 如何与被告知可以异步工作的 django 一起工作

我已经运行了简单的celery 任务,该任务按照文档运行良好,所以我相信我已经安装了 celery 并且运行良好。

但不知何故,我不确定它在return 之后如何工作和运行

例如

我有这个来创建一个新的用户任务

@app.task
def new_user(first, last, table):
    user = UserProfile()
    user.first_name = first
    user.last_name = last
    user.table = table
    user.save()
    return user

我有一个 post api 调用只是为了将其作为 celery 工作原理的示例。

我有这个想法

class List(View):
    def post(self, request):
        all_users = UserMQS().profile()
        output = []
        for user in all_users:
            output.append({
                'id': user.id,
                'first_name': user.first_name,
                'last_name': user.last_name
            })

        ns = new_user.s('First Name1', 'Last Name1', "Table1")
        res = ns.delay()
        return JsonResponse(output, safe=False)
        res.get()

我也尝试过new_user.delay('First Name1', 'Last Name1', "Table1") 之类的方法,但还是不行。

谁能告诉我如何做到这一点?

我希望 return JsonResponse 在创建 new_user 时运行。这不仅仅是为了创建new_user,我只是为了测试 celery 的工作原理,以便在我掌握 celery 后可以实现一些其他的东西。

提前感谢您的任何建议。

【问题讨论】:

  • 如果你想修复一个错误,你可能想展示一个? :) 你的芹菜工人在日志中说了什么?你的 celery 配置怎么样?

标签: python django asynchronous celery


【解决方案1】:

你想要达到的目标是不可能的——至少用这种方法是不可能的。方法返回后不能做某事。你需要决定是等待任务的结果还是直接返回一些东西给客户端。

如果您想快速响应用户(直接返回),您需要在浏览器和您的 django/任务队列之间建立另一个通信通道

一个解决方案可能是django result backend,它将您的任务结果写入 django 数据库。与此一起,您可以创建另一个视图,您可以从浏览器调用该视图,直到出现结果,也就是 long polling

或者你看看websockets。它们使您能够从服务器向客户端发送一些东西,而无需浏览器在前面询问。在 django 世界中,您可能想查看 django channels。在这种情况下,Channels 可能会替代 celery。

这只是实现您所描述的几种可能的方法。

【讨论】:

  • 我想我使用芹菜的想法是错误的,我真的不需要在return 之后调用res.get() 我真正想要的是,让return 完成它的工作,而@987654328 @ 正在创建中,这只是我想要的简化版本,new_user 函数会发生很多事情,这不会影响return 上的结果但是如果等待new_user 则需要一段时间完成然后显示return(如果使用芹菜,我错过了什么才能让它工作?)
  • 另外,感谢您打开频道,当我用谷歌搜索时,芹菜弹出而不是频道。很高兴知道另一个新事物(更多学习)
猜你喜欢
  • 2012-06-26
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多