Закрывается принадлежащая ему копия приемного сокета и вызывается метод hahdle_connect () модуля Web с подключенным сокетом. В ином случае управление находится в родительском процессе. Закрывается принадлежащая ему копия подключенного coкета и продолжается выполнение цикла. Создается впечатление, что производительность сервера, выполняющего прием и ветвление, значительно выше по сравнению с последовательной версией, особенно при обработке страниц со встроенными изображениями.
Web-сервер с предварительным ветвлением, версия 1
Следующая версия сервера не намного сложнее. После открытия приемного сокета сервер выполняет ветвление с созданием заранее заданного числа дочерних процессов. После выполнения своей работы родительский процесс завершается, оставляя дочерние процессы, в каждом из которых работает последовательный цикл accept (). Общее число одновременно работающих соединений, которое может обслужить этот сервер, ограничено числом дочерних процессов, созданных путем ветвления. Проведем анализ программы.
Строки 1-6. Загрузка модулей. Загружаются модули IO:Daemon и Web.
Строки 6, 7. Определение констант. Кроме константы pidfile, необходимой для процедуры init_server (), объявляется константа prefork_children, которая содержит число дочерних серверных процессов, создаваемых путем ветвления.
Строки 8-11. Создание приемного сокета. Как обычно, создается приемный сокет.
Строки 12, 13. Инициализация сервера. Вызывается подпрограмма init_server () модуля daemon для автоматического перевода сервера в фоновый режим, настройки ведения журнала и создания файла РID.