【问题标题】:How are Django channels different than celery?Django 频道与 celery 有何不同?
【发布时间】:2016-12-01 22:29:10
【问题描述】:

最近我开始了解 Django 频道。 谁能告诉我channels和celery的区别,以及celery和channels在哪里使用。

【问题讨论】:

    标签: python django celery channels


    【解决方案1】:

    Django 通道使 Django 能够处理的不仅仅是普通的 HTTP 请求,包括 Websockets 和 HTTP2。将此视为异步发生的 2 路双工通信 没有浏览器刷新。多个客户端可以通过 websocket 发送和接收数据,django 通道编排了这个互通示例,一个群聊,同时客户端同时访问。可以在一定程度上实现类似于 celery 的长时间运行代码的后台处理,但通道的应用与 celery 不同。

    Celery 是一个基于分布式消息传递的异步任务队列/作业队列。以及调度。用外行的话来说,我想在后台触发并运行一个任务,或者我想要一个周期性的任务,在设定的时间间隔内触发并在后台运行。您还可以以同步方式触发任务,也可以触发并等待完成并继续。 所以关键的区别在于它们服务的用例和框架的目标

    【讨论】:

      【解决方案2】:

      Channels 是一个采用 Django 并将其能力扩展到 HTTP 之外的项目——处理 Web 套接字、聊天协议、物联网协议等。它建立在名为 ASGI 的 Python 规范之上。

      Channels 将 Django 更改为在 Django 的同步核心之下和通过其同步核心编织异步代码,从而允许 Django 项目不仅可以处理 HTTP,还可以处理需要长时间运行连接的协议 - WebSockets、MQTT、聊天机器人、业余无线电等等。

      它这样做的同时保留了 Django 的同步和易于使用的特性,允许您选择编写代码的方式 - 以 Django 视图等风格同步、完全异步或两者兼而有之。最重要的是,它提供了与 Django 的身份验证系统、会话系统等的集成,使您比以往任何时候都更容易将仅 HTTP 的项目扩展到其他协议。

      它还将这种事件驱动架构与通道层捆绑在一起,该系统允许您轻松地在进程之间进行通信,并将您的项目分成不同的进程。

      Celery是一个基于分布式消息传递的异步任务队列。它提供了运行实时操作和安排稍后执行的一些任务的功能。这些任务可以异步或同步执行,这意味着您可能更喜欢在后台运行它们或将它们链接起来以使一个任务在另一个任务成功执行后完成。

      【讨论】:

        【解决方案3】:

        Django 频道:

        超越 HTTP - 处理 WebSocket、聊天协议、物联网协议和 更多。

        1. 在客户端和服务器之间传递消息(全双工连接)

        2. 处理 HTTP 和 Web 套接字请求

        3. 异步

        示例:

        • 实时聊天应用
        • 更新社交信息
        • 多人游戏
        • 发送通知

        芹菜:

        这是一个任务队列,专注于实时处理,同时也支持任务调度。

        1. 执行长时间运行的后台任务

        2. 执行周期性任务

        3. 异步

        示例:

        • 处理视频/图像
        • 批量发送电子邮件

        进一步阅读

        Example of Celery and Django Channels

        Asynchronous vs Synchronous

        【讨论】:

          【解决方案4】:

          其他答案,极大地解释了差异,但实际上 Channels 和 Celery 都可以共同执行异步池任务。

          Channels 和 Celery 都为消息和工作守护进程使用后端。所以同样的事情可以用两者来实现。

          但请记住,Celery 主要用于并且可以处理大多数任务池问题(重试、结果后端等),而 Channels 绝对不适合。

          【讨论】:

            【解决方案5】:
            • Django 中的Channels 用于WebSocketlong-poll HTTP

            • Celery 用于后台任务,队列。

            【讨论】:

              【解决方案6】:

              Channels 在 Django 中用于异步处理请求。
              Django 使用的标准模型是 Request-Response,但它有很大的局限性。我们不能做任何超出该模型限制的事情。
              Channels 的出现允许 Web Socket 支持和围绕 Web Sockets 构建复杂的应用程序,以便我们可以发送多条消息、管理会话等。

              Celery是完全不同的东西,它是一个基于分布式消息传递的异步任务队列/作业队列。它主要用于对任务进行排队并安排它们以特定的时间间隔运行。

              简单地说,当您需要 asynchronous data communication 时使用 Channels,例如聊天应用程序,而 Celery 用于安排任务和事件,例如服务器以固定的时间间隔在网络上抓取特定类型的新闻。

              【讨论】:

              • Django 频道确实支持后台处理。我认为问题更多在于,django 通道后台处理与 celery 工作人员有何不同。
              • 你说“芹菜是完全不同的东西”。我认为从高层次的角度来看,它们并没有完全不同。发生什么了?输入、处理、输出 :-) 见:en.wikipedia.org/wiki/IPO_model
              • 假设我想生成一些需要 30 秒的文件,我应该使用 Celery 还是 Channels?
              • @johan Celery 会更好。
              • @Johan 但如果您想长期跟踪日志文件并将其提供给您的网络浏览器客户端通道是正确的方法。
              猜你喜欢
              • 2021-12-22
              • 2017-11-06
              • 1970-01-01
              • 1970-01-01
              • 2021-09-29
              • 2013-09-18
              • 2019-12-26
              • 2018-10-19
              • 2018-12-04
              相关资源
              最近更新 更多