我如何延迟并获得芹菜和django的回归?

时间:2017-10-05 01:08:10

标签: python django asynchronous celery

目前正在尝试清除celery如何使用被告知的django可以异步工作

我已经运行了简单的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

我有一个后api电话,只是为了让它成为芹菜如何工作的样本。

我认为这是

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我只是为了测试芹菜是如何工作的,所以一旦拿到芹菜,我就可以实施其他一些东西。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

您想要实现的目标是不可能的 - 至少不是这种方法。返回后,方法无法执行某些操作。您需要决定是否要等待任务结果或直接向客户返回内容。

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

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

或者你看看websockets。它们使您能够从服务器向客户端发送内容,而无需浏览器在前面询问。在django世界中,你可能想要看django channels。在这种情况下,渠道可能是芹菜的替代品。

这只是实现你所描述内容的几种可能方式。