Lit*_*ait 2 django django-channels
我读过我只需要在我的代码中的某个地方使用 channel_layer.send(....
这样对吗?我认为工作人员是处理所有 websocket 请求的人。
请赐教。谢谢。
Mar*_*ndi 11
您的问题背后有许多有趣的概念需要澄清。我们先从 WebSocket 的使用说起。
WebSocket 可能是您对使用 Django Channels 的主要兴趣,因为 Django 单独管理 HTTP。
为此,您不需要通道层,也不需要正在运行的工作程序。
在 development 中,这是您通常看到的启动标准 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.
Run Code Online (Sandbox Code Playgroud)
但是,将频道添加到 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.
Run Code Online (Sandbox Code Playgroud)
那是因为 Channels 开发服务器已经接管了 Django 开发服务器,您可以立即开始使用 HTTP 和 WebSocket 通信。
生产中:
您可以选择对 HTTP 和 WebSockets 请求都使用 Daphne,因为 Daphne 将在 HTTP 和 WebSocket 之间自动协商
或者,您可以拆分 HTTP 和 WebSocket 流量:通过 WSGI 服务器运行标准 HTTP 请求,并仅将 Daphne(或 uvicorn)用于 WSGI 不能做的事情,如 WebSockets、HTTP 长轮询或其他物联网协议
参考:
https://channels.readthedocs.io/en/latest/deploying.html#http-and-websocket
https://avilpage.com/2018/05/deploying-scaling-django-channels.html
自 2.0 版起,通道层是通道的完全可选部分。
它们提供了一种抽象,允许您出于多种目的在应用程序的不同实例之间进行对话。
如何 ?当您发送消息时,它会被收听另一端的组或频道的消费者接收。
我使用通道层的主要动机是组概念,它让我向所有注册(连接时)到特定组的 WebSocket 客户端广播一条消息。为此,我不需要工作人员:我使用 channel_layer.group_send() 将我的消息发送到组,然后通道层将其传递给消费者,消费者又将其发送给 WebSocket 客户端。
通道层的一个非常特殊的用途是将一些工作委托给一组监听固定通道名称的工作服务器,作为一个简单的任务队列。
此处(且仅此处)是“runworker”命令的用武之地。
大多数情况下,您会为此使用其他著名的解决方案,例如 Celery 或 Django-rq;但在某些情况下,对于简单的后台任务队列,这可能是一种廉价且延迟极低的替代方案。
参考:
https://channels.readthedocs.io/en/latest/topics/worker.html#worker-and-background-tasks
| 归档时间: |
|
| 查看次数: |
1492 次 |
| 最近记录: |