Я знаю, что GIL Python и потоки в Python не так просты, как нерест в Go. Тем не менее, мне кажется, что Ruby смог снять его с Puma и Unicorn, чтобы добиться параллелизма с многопоточными. Мой вопрос на самом деле в два раза. Мой опыт ограничен Дафной канала Django.
-
Помимо Дафни, какие другие варианты веб-сервера многопоточны, как пума и единорог в Rails?
-
Из документации Дафни я узнал, что параллелизм достигается за счет нереста новых процессов (рабочих)
Поскольку работа работающих пользователей отделена от работы с HTTP, WebSocket и другими клиентскими подключениями, вам нужно запустить кластер «рабочих серверов» для выполнения всей обработки. Каждый сервер является однопоточным, поэтому рекомендуется использовать один или два ядра на каждой машине; ita € ™ s безопасно запускать столько одновременных работников на той же машине, сколько вам нравится, поскольку они не открывают никаких портов (все, что они делают, это говорить с бэкэнд канала).
Как указано, каждый рабочий является однопоточным. Когда дело доходит до вызова функции ввода-вывода, рабочий полностью блокируется. Мой вопрос заключается в том, почему Daphne не может генерировать несколько потоков для каждого запроса. Когда один поток блокируется I / O, например, доступом к базе данных, CPU переключается на выполнение другого потока до тех пор, пока предыдущий поток не будет разблокирован. Аналогично, Node.js является однопоточным, но он действительно хорошо работает через неблокирующий ввод-вывод. Почему трудно достичь того же умения. в Python? (кроме того, что ему не хватает хорошего цикла событий).
python,django,concurrency,django-channels,daphne,