Django和Channels和ASGI线程问题

时间:2018-08-31 07:43:55

标签: django multithreading channels

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

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

你知道为什么吗?如何解决或限制它?

1 个答案:

答案 0 :(得分:0)

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

如果未设置环境变量function getHoursFormat( $given ){ $hours = ( $given > 86399 ) ? '0'.floor( ( $given / 86400 ) * 24 )-gmdate( "H", $given ) : gmdate("H", $given ); $min = gmdate( "i", $given ); $sec = gmdate( "s", $given ); $formatted_string = $hours.':'.$min.':'.$sec; return $formatted_string; } ,则使用默认设置ASGI_THREADS,该默认值IMO太高,因为它是CPU内核数乘以5的值。将ASGI_THREADS设置为较低的值编号并使用多个达芙妮工艺。通过使用较少数量的线程和多个进程,可以避免因Python的全局解释器锁定而导致的某些速度下降。