Django, каналы и проблема с потоком ASGI

У меня проблема с использованием django и каналов (в режиме asgi), когда я устанавливаю каналы django и использую режим asgi, мое приложение создает новый поток для каждого HTTP-запроса и каждого сообщения, которое я отправляю из канала

Например, предположим, что мое приложение представляет собой простой сервер эхо-чата, когда я запускаю свой сервер и запрашиваю подключение к сокету в качестве клиента, количество потоков увеличивается, а также, когда я снова отправляю что-то в сокет, поток увеличивается с каждым сообщением.

Ты знаешь почему? Как я могу это исправить или ограничить?


person alpha    schedule 31.08.2018    source источник


Ответы (1)


Для синхронных запросов каналы создают пул потоков. Если он запускал HTTP-запросы в цикле событий, каждый запрос к базе данных и попадание в кеш блокировали бы цикл событий.

Если вы не устанавливаете переменную среды ASGI_THREADS, она использует значение по умолчанию, установленное concurrent.futures.ThreadPool, IMO которого слишком велико, поскольку это количество ядер ЦП, умноженное на 5. Установите ASGI_THREADS на меньшее число и используйте несколько процессов Daphne. Используя меньшее количество потоков и несколько процессов, вы избегаете некоторого замедления, вызванного глобальной блокировкой интерпретатора Python.

person kagronick    schedule 14.12.2018