Вопрос по wsgi, concurrency, python, tornado – Возможен ли параллелизм в торнадо?

8

Я понимаю, что торнадо является однопоточным и неблокирующим сервером, поэтому запросы обрабатываются последовательно (за исключением случаев использования подхода, управляемого событиями, для операций ввода-вывода).

Есть ли способ обрабатывать несколько запросов параллельно в торнадо для нормального (не IO) выполнения. Я не могу разветвлять несколько процессов, так как мне нужно общее пространство памяти для запросов.

Если это невозможно, пожалуйста, предложите мне другие серверы Python, которые могут обрабатывать параллельные запросы и также поддерживают wsgi.

Ваш Ответ

2   ответа
9

ыми запросами, которые связаны с вычислениями, и вы хотите сделать это в Python, то вам нужен многопроцессорный сервер, а не многопоточный. CPython имеет глобальную блокировку интерпретатора (GIL), которая предотвращает одновременное выполнение байт-кода python более чем одним потоком.

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

5

как долго эти вычислительные потоки будут работать. Если они работают недолго, и скорость их обработки, по крайней мере, соответствует скорости, с которой они прибывают, то с Торнадо все будет в порядке. Он действительно однопоточный, но очень хорошо масштабируется.

Если ваши связанные с вычислениями запросы выполняются долго, то использование многопоточного сервера не обязательно поможет, поскольку, как уже указывал Нед Батчелдер, GIL будет узким местом.

Если вы можете ослабить ограничение на использование одного и того же пространства памяти для всех запросов, вы можете рассмотреть возможность запуска Tornado сPyZMQ, поскольку он обеспечивает способ запуска нескольких серверных торнадо, запущенных одним экземпляром торнадо. Это позволяет вам продолжать использовать Торнадо для всего решения. Смотрите PyZMQweb.zmqweb Модуль для получения дополнительной информации.

zmqweb был извлечен из PyZMQ в свой собственный проект:github.com/ellisonbg/zmqweb
Спасибо за ваши ответы. Я не знаю о GIL. Так что я никак не могу сделать параллельный процесс, используя потоки в CPython, и мне приходится работать с несколькими процессами. Adhi
Вы можете выполнять параллельную обработку в Python, но вы не будете использовать все свои ресурсы, поскольку при запуске кода Python вы будете использовать только один процесс на процессоре Python. Таким образом, вы можете использовать потоки для параллелизма, но есть определенный предел доступного прироста производительности. Но большую часть времени Tornado будет ожидать ввода-вывода, так что, например, добавление многопоточности принесет немало пользы.

Похожие вопросы