Вы сказали, что у вас уже есть цикл событий на первом уровне. В некотором смысле, ваш сервер второго уровня должен также организовать некоторый цикл обработки событий для асинхронной обработки. Есть много способов закодировать его, используя perl, например AnyEvent
, POE
, Event
и многие другие. В конце концов, все они используют одно из средств select
, poll
, epoll
, kqueue
ОС (или их эквивалент в Windows). Если вы чувствуете себя комфортно при кодировании на относительно низком уровне, вы можете просто использовать встроенный в perl select
или, альтернативно, его объектно-ориентированный аналог, IO::Select
.
По сути, вы создаете два прослушивающих сокета (вам может понадобиться только один, если первый уровень использует тот же протокол связи, что и третий уровень для связи с вашим сервером), добавьте его к объекту IO::Select
и сделайте выборку на нем. После подключения
сделано, добавляешь принятые сокеты в выделенный объект.
Метод select
для IO::Select
вернет вам список сокетов, готовых для чтения или записи (я игнорирую возможность исключений здесь). Конечно, вы должны следить за своими сокетами, чтобы знать, какой из них какой. Кроме того, логика связи будет несколько сложной, потому что у вас есть для использования неблокирующих сокетов.
Что касается второй части вашего вопроса, меня немного смущает то, что вы подразумеваете под "cgi" - будь то общий интерфейс шлюза (т. Е. Веб-сценарии на стороне сервера) или это сокращение для "компьютерная графика". В обоих случаях я думаю, что для вашей задачи имеет смысл использовать серверный push.
В последнем случае это все, что я хотел бы сказать. В первом случае я предлагаю вам Google для «Комета» (как в «AJAX»). : -)