Почему каналы Django Daphne не могут использовать многопоточность для одновременного обработки запроса?

Я знаю, что GIL Python и потоки в Python не так просты, как нерест в Go. Тем не менее, мне кажется, что Ruby смог снять его с Puma и Unicorn, чтобы добиться параллелизма с многопоточными. Мой вопрос на самом деле в два раза. Мой опыт ограничен Дафной канала Django.

  1. Помимо Дафни, какие другие варианты веб-сервера многопоточны, как пума и единорог в Rails?

  2. Из документации Дафни я узнал, что параллелизм достигается за счет нереста новых процессов (рабочих)

    Поскольку работа работающих пользователей отделена от работы с HTTP, WebSocket и другими клиентскими подключениями, вам нужно запустить кластер «рабочих серверов» для выполнения всей обработки. Каждый сервер является однопоточным, поэтому рекомендуется использовать один или два ядра на каждой машине; ita € ™ s безопасно запускать столько одновременных работников на той же машине, сколько вам нравится, поскольку они не открывают никаких портов (все, что они делают, это говорить с бэкэнд канала).

Как указано, каждый рабочий является однопоточным. Когда дело доходит до вызова функции ввода-вывода, рабочий полностью блокируется. Мой вопрос заключается в том, почему Daphne не может генерировать несколько потоков для каждого запроса. Когда один поток блокируется I / O, например, доступом к базе данных, CPU переключается на выполнение другого потока до тех пор, пока предыдущий поток не будет разблокирован. Аналогично, Node.js является однопоточным, но он действительно хорошо работает через неблокирующий ввод-вывод. Почему трудно достичь того же умения. в Python? (кроме того, что ему не хватает хорошего цикла событий).

python,django,concurrency,django-channels,daphne,

1

Ответов: 2


0 принят

Прямо сейчас, uvicorn - единственная альтернатива дафне, которая поддерживает многопроцессорную обработку и готова к использованию.

$ pip install uvicorn

$ uvicorn avilpage.asgi --workers 4

Это запускает сервер с 4 рабочими.

Поскольку daphne / uvicorn используют asyncio для многозадачности, я думаю, что многопоточность не имеет смысла.


0

Рабочие не одиночные. Каждый из них открывает пул потоков для запуска всех запросов к базе данных и всего, на что вы запускаете sync_to_async. Фокусирование Дафни на async, и чем больше вы держите в основной теме асинхронно, тем быстрее это происходит. Вы хотите как можно меньше устранить переключение контекста, чтобы кэширование процессора оставалось свежим. Кроме того, GIL Python поддерживает только один поток, работающий одновременно, поэтому нет увеличения скорости с несколькими потоками. У вас может быть 25 потоков, и он будет работать так же быстро, как 1 поток: https://gist.github.com/agronick/692d9a7bc41b75449f8f5f7cad93a924

Python, Django, параллелизм, Джанго-каналы, Дафна,
Похожие вопросы