Прежде чем перейти к описанию Web-cepвepa с предварительным формированием потоков, рассмотрим простую многопоточную версию этого сервера. Его суть состоит в том, что цикл accept () выполняется в основном потоке. Каждое входящее соединение, например, запрос страницы по оценке дома , передается новому “рабочему” потоку, который обслуживает соединение, а затем завершает работу. Поэтому для обслуживания каждого входящего соединения создается, а затем уничтожается один новый поток.
Проведем анализ программы.
Строки 1-7. Загрузка модулей. Кроме стандартных модулей, загружается модуль Thread, который предоставляет доступ к API-интерфейсу потоков Perl.
Строки 8-10. Создание констант, глобальных переменных и обработчиков прерывания. Выбирается путь, который будет применяться для доступа к файлу PID сервера, и устанавливаются обработчики сигналов, которые позволяют корректно завершить работу сервера после получения сигнала term или int.
Строки 11-17. Создание приемного сокета и автоматический перевод в фоновый режим. Создается приемный сокет, и сервер переводится в фоновый режим путем вызова процедуры init_server() модуля Daemon. Снова создается объект IO::Select для использования в главном цикле в целях предотвращения блокировки выполнения функции accept () при получении сигнала завершения.
Строки 18-24. Цикл accept (). Этот цикл аналогичен другим циклам, рассматриваемым здесь. Для каждого нового входящего соединения вызывается метод Thread->new () для запущенного нового потока выполнения. В новом потоке выполняется подпрограмма do_thread ().