Django 和 Channels 以及 ASGI 线程问题

标签 django multithreading channels

我在使用 django 和 channel 时遇到问题(在 asgi 模式下)
当我设置 django channel 并使用 asgi 模式时,我的应用程序为每个 http 请求和我从 channel 发送的每条消息创建一个新线程

例如假设我的应用程序是一个简单的回声聊天服务器
当我运行我的服务器并请求以客户端身份连接到套接字时,线程增加了,而且当我再次向套接字发送内容时,每条消息都会增加线程。

你知道为什么吗?我该如何修复或限制它?

最佳答案

对于同步请求,Channels 创建了一个 ThreadPool。如果它在事件循环中运行 HTTP 请求,每个数据库查询和缓存命中都会锁定事件循环。

如果不设置环境变量ASGI_THREADS它使用由 concurrent.futures.ThreadPool 设置的默认值IMO 太高了,因为它是 CPU 内核数乘以 5。将 ASGI_THREADS 设置为较低的数字并使用多个 Daphne 进程。通过使用较少数量的线程和多个进程,您可以避免由 Python 的全局解释器锁引起的某些速度减慢。

关于Django 和 Channels 以及 ASGI 线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52110761/

相关文章:

django - 如果表达式为 True,则更改 django 管理界面中字段的字体/颜色

python - 如何显示django类别名称而不是Category对象(一)

java - 为一个具有硬限制保证的线程使用执行程序是否有意义?

c++ - 线程安全队列和虚假唤醒

音频采样频率依赖于 channel 吗?

go - 这个例子中的 channel 是如何工作的?

Django 将数字渲染为 5 星评级

jquery - 为什么我的 JSONP 返回无效的 JSON

c++ - 通过引用传递与通过指针传递 : Boost threads and deadline timer

Golang channel 卡住