【发布时间】:2019-09-24 17:18:31
【问题描述】:
我在某处读到,如果我在代码中的某处使用channel_layer.send(....),我只需要启动一个worker。
这是正确的吗?我认为工作人员是处理所有 WebSocket 请求的人。
【问题讨论】:
我在某处读到,如果我在代码中的某处使用channel_layer.send(....),我只需要启动一个worker。
这是正确的吗?我认为工作人员是处理所有 WebSocket 请求的人。
【问题讨论】:
您的问题背后有许多有趣的概念需要澄清。 让我们先从 WebSocket 的使用开始。
WebSocket 很可能是您使用 Django Channels 的主要兴趣,因为 Django 仅管理 HTTP。
为此,您不需要通道层,也不需要正在运行的工作人员。
在开发中,这是您通常在启动标准 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.
但是,将 channels 添加到 INSTALLED_APPS 并按照 Django Channels 文档的建议定义 ASGI_APPLICATION 设置,您会注意到输出略有不同:
$ 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 协议。
参考资料:
从 2.0 版开始,通道层完全是通道的可选部分。
它们提供了一种抽象,允许您出于多种目的在应用程序的不同实例之间进行对话。
怎么样?当您发送消息时,另一端收听组或频道的消费者会收到该消息。
我使用 Channel Layers 的主要动机是 Group 概念,它允许我向所有注册(在连接时)到特定组的 WebSocket 客户端广播消息。为此,我不需要工作人员:我将消息发送到使用 channel_layer.group_send() 的组,通道层将其传递给消费者,消费者再将其发送到 WebSocket 客户端。
Channel Layers 的一个非常具体的用途是将一些工作委托给一组侦听固定通道名称的工作服务器,作为一个简单的任务队列。
这里(而且只有这里)是runworker命令的来源。
大多数情况下,您会为此使用其他著名的解决方案,例如 Celery 或 Django-rq;但在某些情况下,对于简单的后台任务队列来说,这可能是一种廉价且延迟非常低的替代方案。
参考资料:
【讨论】: