django - 我需要开始工作吗?

标签 django django-channels

我在某处读到过,如果我在代码中的某处使用 channel_layer.send(....),我只需要启动一个 worker 。 .
这样对吗?我认为工作人员是处理所有 WebSocket 请求的人。

最佳答案

您的问题背后有许多有趣的概念需要澄清。
我们先从 WebSocket 的使用说起。
网络套接字
WebSocket 很可能是您使用 Django Channels 的主要兴趣,因为 Django 单独管理 HTTP。
为此,您不需要 channel 层,也不需要正在运行的工作程序。
开发中 ,这是您通常在启动标准 Django 项目时看到的内容:

$ python manage.py runserver

Performing system checks...
...
Django version 2.1.5, using settings 'djlistener.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
但是,添加 channelsINSTALLED_APPS并定义 ASGI_APPLICATION按照 Django Channels 文档的建议进行设置,您会注意到输出略有不同:
$ python manage.py runserver

Performing system checks...
...
Django version 2.1.5, using settings 'djlistener.settings'
Starting ASGI/Channels version 2.1.6 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
那是因为 Channels 的开发服务器已经接管了 Django 开发服务器,您可以立即开始使用 HTTP 和 WebSocket 通信。
生产中 :
  • 您可以选择将 Daphne 用于 HTTP 和 WebSockets 请求,因为 Daphne 将在 HTTP 和 WebSocket 之间自动协商。
  • 或者,您可以拆分 HTTP 和 WebSocket 流量:通过 WSGI 服务器运行标准 HTTP 请求,并仅将 Daphne(或 uvicorn)用于 WSGI 无法执行的操作,例如 WebSocket、HTTP 长轮询或其他 IoT 协议(protocol)。

  • 引用:
  • Django channel 的文档:HTTP and WebSocket
  • How To Deploy Django Channels To Production

  • channel 层
    自 2.0 版起, channel 层是 channel 的完全可选部分。
    它们提供了一种抽象,允许您出于多种目的在应用程序的不同实例之间进行对话。
    如何?当您发送消息时,它会被收听另一端的组或 channel 的消费者接收。
    我使用 channel 层的主要动机是组概念,它让我向所有注册(连接时)到特定组的 WebSocket 客户端广播一条消息。为此,我不需要 worker :我用 channel_layer.group_send() 将我的消息发送到组,Channels Layer 将其传递给 Consumer,后者又将其发送给 WebSocket 客户端。
    Worker 和后台任务
    channel 层的一个非常特殊的用途是将一些工作委托(delegate)给一组监听固定 channel 名称的工作服务器,作为一个简单的任务队列。
    这里 (仅在此处)是哪里runworker命令进来。
    大多数情况下,您会为此使用其他著名的解决方案,例如 Celery 或 Django-rq;但在某些情况下,对于简单的后台任务队列,这可能是一种廉价且延迟极低的替代方案。
    引用:
    Worker and Background Tasks

    关于django - 我需要开始工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58085318/

    相关文章:

    javascript - 在 Javascript Django 中从 'param' 的 'views.py' 获取值

    python - 线程中的 Django 未处理异常由 <function check_errors.<locals>.wrapper at 0x035D2618> 启动

    javascript - 整个站点使用一个 Django Channels websocket 消费者?

    Django channel daphne 返回 200 状态代码

    django - 混合 Websocket 和 REST

    python - Listview 基于类的 View 无法正常工作

    python - 类型错误 : metaclass conflict in python

    python - Celery 在将我的查询集 obj 作为参数传递时引发错误

    python - 使用来自消费者类外部的 Django Channels 发送消息

    Django Channels 2.0 和 Daphne : serving static and media files