Многопоточный веб-сервер против однопоточных - PullRequest
3 голосов
/ 16 декабря 2010

У нас есть простой веб-сервер для внутреннего использования, который имеет только одну обязанность: прослушивать запросы, читать их и помещать данные в базу данных. БД и веб-сервер находятся на одной машине. БД - это mysql-db, а сервер - веб-сервер python (BaseHTTPServer.HTTPServer), который работает в однопоточном режиме.

Проблема в том, что два запроса не могут быть обработаны одновременно. Вопрос в том, поможет ли сделать веб-сервер многопоточным (используя django, cheryypy, ..)? Интуитивно понятно, что веб-сервер выполняет только задачи, потребляющие ресурсы ЦП, поэтому изменение его на многопоточное не должно помочь. Это правильно?

Ответы [ 5 ]

2 голосов
/ 16 декабря 2010

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

Это не значит, что два запроса будут обработаны быстрее . Наличие пула процессов или потоков очень полезно для производительности веб-сервера, но это не очень заметно в подобных случаях (если у вас нет нескольких ядер). Но у MySQL нет проблем с обработкой двух запросов одновременно, поэтому, если ваш веб-сервер может это сделать, то вы избавитесь от проблемы обработки только одного запроса.

Но если стоит начать использовать такой сервер, только вы можете ответить. :) Django, безусловно, излишне в любом случае, посмотрите на какой-нибудь маленький WSGI-сервер.

1 голос
/ 16 декабря 2010

Шаг 1. Используйте Apache.Это может показаться излишним, но это дешевая многопоточность без программирования с вашей стороны.Apache может быть настроен на разветвление нескольких серверов.Никакого программирования с вашей стороны.

Этого может быть достаточно для одновременной работы приложения.

Шаг 2. Перепишите приложение, чтобы оно использовало инфраструктуру wsgi, и вставьте его на сервер wsgiref.Это не сильно изменится, но так вы должны всегда писать небольшие веб-приложения.

Шаг 3. Используйте mod_wsgi в Apache.Это позволяет вам иметь одну или несколько фоновых версий своего приложения.Без дополнительного программирования вы получаете кучу параллелизма.

Важный урок. Всегда используйте WSGI.

0 голосов
/ 16 декабря 2010

Вам следует перейти на многопоточный или асинхронный веб-сервер, в противном случае каждый запрос блокируется. Django - это веб-фреймворк, вам, возможно, придется поискать сценарии, которые вы можете прозрачно заменить в текущей настройке, и при этом у вас все еще будет свой многопоточный веб-сервер на чистом python. В противном случае витая тоже хорошее решение. AFA Я вижу, вы можете не захотеть Web Framework, потому что вы не делаете приложение в стиле MVC на основе шаблонов.

0 голосов
/ 16 декабря 2010

Мой инстинкт говорит, что вы правы, но он также говорит, что использование Django или Cherrypy - ВЕСЬ перебор, даже если вы хотели сделать его многопоточным.

Я думаю, что вы правы, поскольку, если веб-сервер действительно не делает ничего, кроме работы с БД, то любой другой поток не сможет ничего сделать, кроме как запустить ответ. Клиент с радостью будет ждать от десяти до ста мс, необходимых для завершения другого запроса, и тогда сервер сможет accept() сразу.

0 голосов
/ 16 декабря 2010

Если веб-сервер однопоточный и запросы к БД синхронны (это означает, что веб-сервер заблокирован во время обработки запроса БД), то его многопоточность поможет.

Это позволит вамобрабатывать несколько запросов одновременно.Ваш движок БД, вероятно, довольно хорош в этом.Однако сейчас вы не позволяете ему обслуживать несколько запросов одновременно, потому что прямо перед ним находится веб-сервер, который передает ему только один запрос за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...