【问题标题】:Django and Channels and ASGI Thread ProblemDjango 和 Channels 和 ASGI 线程问题
【发布时间】:2019-02-06 05:01:29
【问题描述】:
我在使用 django 和频道时遇到问题(在 asgi 模式下)
当我设置 django 频道并使用 asgi 模式时,我的应用程序为每个 http 请求和我从频道发送的每条消息创建一个新线程
例如假设我的应用是一个简单的回声聊天服务器
当我运行我的服务器并请求作为客户端连接到套接字时,线程增加了,而且当我再次向套接字发送一些东西时,每条消息都会增加线程。
你知道为什么吗?我该如何解决或限制它?
【问题讨论】:
标签:
django
multithreading
channels
【解决方案1】:
对于同步请求,Channels 会创建一个 ThreadPool。如果它在事件循环中运行 HTTP 请求,每个数据库查询和缓存命中都会锁定事件循环。
如果您不设置环境变量ASGI_THREADS,它使用concurrent.futures.ThreadPool 设置的默认值,IMO 太高了,因为它是 CPU 内核数乘以 5。将 ASGI_THREADS 设置为较小的数字并使用多个达芙妮进程。通过使用较少数量的线程和多个进程,您可以避免由 Python 的全局解释器锁导致的一些减速。