Высокопроизводительный сокет-сервер с использованием Perl - PullRequest
2 голосов
/ 13 июля 2010

Мне нужно написать сокет-сервер, используя perl, который будет работать на 64-битной Linux (2.6x ядро).Есть ли библиотека для поддержки портов завершения ввода-вывода и какой-либо эквивалент в Linux?

Мне нужно прослушать несколько портов.8000-8100 есть ли умный способ сделать это?

Протокол должен использовать длину байта.

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

заранее спасибо.

1 Ответ

5 голосов
/ 13 июля 2010

Threading в Perl обычно не рекомендуется.

Вместо этого, для высокой производительности, вы должны рассмотреть non blocking или event driven programming.

При использовании обычных сокетов ваш процесс блокирует каждую операцию ввода-вывода, т. Е. Чтение из сокета, который еще не готов, переведет ваш процесс в спящий режим до тех пор, пока данные не станут доступны. с неблокируемой / управляемой событиями вы опрашиваете сокеты и получаете обратные вызовы, когда сокеты готовы для чтения или записи, поэтому один процесс может мультиплексироваться на многих сокетах, обеспечивая таким образом хорошую масштабируемую производительность, так как вам не нужно форкать новые процессы для обработки большего количества клиентов.

В Perl есть много хороших основанных на событиях фреймворков, например, POE и AnyEvent POE - это особый цикл событий со множеством модулей и функций, а AnyEvent - уровень абстракции, который позволяет вам использовать несколько циклов событий в одном и том же коде.

Вы также должны посмотреть на libev , который похож на POE, но с гораздо меньшими накладными расходами.

Писать код, управляемый событиями, поначалу довольно сложно, так как вы должны быть осторожны с блокирующим кодом, который у вас есть, например, интенсивная работа процессора или использование библиотек, которые не являются блокирующими. потому что, поскольку у вас есть только один процесс, если он занят чем-то, он больше ничего не может сделать - например, опросить сокеты и вызвать обратные вызовы.

Итак, если вам нужны как неблокирующие, так и интенсивные вычисления, один из способов сделать это - создать рабочие вилки и использовать неблокирующие каналы для связи между ними и вашим циклом обработки событий, что на самом деле просто для вышеуказанных библиотек.

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