Почему Django Channels Daphne не может использовать многопоточность для одновременной обработки запроса? - PullRequest
0 голосов
/ 07 июня 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

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

0 голосов
/ 08 июня 2018

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

$ pip install uvicorn

$ uvicorn avilpage.asgi --workers 4

Запускает сервер с 4 работниками.

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

...