2014-01-15 2 views
0

Я пытаюсь понять идею неблокирующего веб-сервера, и кажется, что мне что-то не хватает.Как работает неблокирующий веб-сервер?

Я могу понять, что есть несколько причин для "блок" веб-запроса (psuedocode):

  1. ЦП

    строка on_request (Arg)
    {
    DO_SOME_HEAVY_CPU_CALC
    возвращение «сделано «;
    }

  2. И.О. связаны

    строку on_request (Arg)
    {
    DO_A_CALL_TO_EXTERNAL_RESOURCE_SUCH_AS_WEB_IO
    возвращение "сделано";
    }

  3. сна

    строка on_request (Arg)
    {
    сна (VERY_VERY_LONG_TIME);
    возвращение «сделано»;
    }

    • являются все три могут извлечь выгоду из неблокирующая сервера?
    • Как ситуация, которая приносит пользу от неблокирующего веб-сервера, действительно делает это? Я имею в виду, глядя на документацию сервера Tornado, кажется, нравится «бесплатно». Я знаю, что поток можно спать и ждать сигнала от операционной системы (по крайней мере, в Linux), - это смысл «освобождения» потока? это какая-то более высокая реализация уровня ? что-то, что на самом деле создает новый поток , который ждет нового запроса вместо «спящего»?
    • Я что-то пропустил?

Благодаря

ответ

1

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

  • Создать много сокетов и сделать их блокирующими
  • Переключите состояние их «подключить»
  • Инициировать connect операции на каждом из них
  • Опрос всех их до тех пор, пока не произойдут какие-либо события
  • Обработать события, связанные с запуском (соединение установлено или соединение не выполнено)
  • Включить состояние, установленное для «отправки»
  • Подготовка веб-запрос в буфере
  • Poll «отправляющий» гнезда для операции записи
  • send данные для тех, кто получил событие WRITE установить
  • Для тех, которые имеют все данные, посланные, переключать состояние на «прием»
  • Опрос «получение» гнезда для работы READ
  • для тех, которые имеют множество событий READ, выполнить read и обработать считанные данные в соответствии с протоколом
  • Повторите, если протокол биди вырезать или закрыть розетку, если это не так.

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

Что касается опроса, я опубликовал статью о том, как здесь работают разные методы опроса: http://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-difference-for-system-architects/ - Предлагаю вам проверить его.

+0

спасибо за подробное объяснение! – user3197748

+0

Возможно, вы захотите принять ответ, чтобы он не показывался как «без ответа», когда люди смотрят, чтобы ответить на другие вопросы :) спасибо! –

0

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

Смежные вопросы