【问题标题】:Returning the result of celery task to the client in Django template在 Django 模板中将 celery 任务的结果返回给客户端
【发布时间】:2018-04-05 20:17:05
【问题描述】:

所以我正在努力完成以下工作。用户浏览网页,同时有一个任务在后台运行。当任务完成时,它应该返回args,其中args 之一是flag: True,以便触发javascript 并且javascript 显示一个模态表单。

我之前在没有异步任务的情况下测试过它并且它可以工作,但现在使用 celery 它只是将结果存储在数据库中。我对 tornado-celery 和相关的东西做了一些研究,但是像 tornado-redis 这样的一些组件不再被维护,所以在我看来使用它不会是虎钳。

那我有什么选择,谢谢?

【问题讨论】:

    标签: django redis django-celery


    【解决方案1】:

    如果我对您的理解正确,那么您想从服务器端将某些内容传回客户端。您通常有以下三种选择:

    1) 向服务器发出一个长时间挂起的请求 - 有点糟糕。跳过详细信息,如果未配置为处理该问题,它将使您的网络服务器陷入困境,这将使您的网站在性能测试中得分较低,如果请求失败,一切都会失败。
    2)以时间间隔(0.2 s,类似的)轮询大量请求的服务器 - 更好。它会增加流量,但请求会很小,不会对站点的性能造成太大影响。如果您设置很长的时间间隔以不向服务器加载无意义的请求,那么用户会延迟看到数据。从好的方面来说,即使连接中断,这也不会失败(如果写入正确)。
    3)Websockets,服务器可以在需要时向客户端发送任何消息 - 很好,但需要一些时间来适应。如果你想尝试,你可以使用django-channels,这是一个很好的 Django websockets 库。

    如果我没有正确理解您并且这不是手头的问题并且您正在考虑如何将数据从 Celery 任务返回到 Django,那么您可以存储 Celery 任务 ID-s 并使用 ID-s首先检查任务是否完成,然后从 Celery 中查询数据。

    【讨论】:

    • 所以我尝试了django-channels 并且同步和异步任务工作正常,但是当我尝试使用工作者进行后台任务时,它在from channels import Channel 上引发了错误。快速搜索,我发现组导入也是如此。这可能是一个错误,因为我发现的信息是几天前的。所以我又回到了 celery,现在我正在尝试使用 task_id 实施过去的最后一条建议。
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2014-07-22
    • 2021-02-25
    • 2022-11-25
    • 2011-04-25
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多