Threading в Perl обычно не рекомендуется.
Вместо этого, для высокой производительности, вы должны рассмотреть non blocking
или event driven programming
.
При использовании обычных сокетов ваш процесс блокирует каждую операцию ввода-вывода, т. Е. Чтение из сокета, который еще не готов, переведет ваш процесс в спящий режим до тех пор, пока данные не станут доступны. с неблокируемой / управляемой событиями вы опрашиваете сокеты и получаете обратные вызовы, когда сокеты готовы для чтения или записи, поэтому один процесс может мультиплексироваться на многих сокетах, обеспечивая таким образом хорошую масштабируемую производительность, так как вам не нужно форкать новые процессы для обработки большего количества клиентов.
В Perl есть много хороших основанных на событиях фреймворков, например, POE и AnyEvent POE - это особый цикл событий со множеством модулей и функций, а AnyEvent - уровень абстракции, который позволяет вам использовать несколько циклов событий в одном и том же коде.
Вы также должны посмотреть на libev , который похож на POE, но с гораздо меньшими накладными расходами.
Писать код, управляемый событиями, поначалу довольно сложно, так как вы должны быть осторожны с блокирующим кодом, который у вас есть, например, интенсивная работа процессора или использование библиотек, которые не являются блокирующими. потому что, поскольку у вас есть только один процесс, если он занят чем-то, он больше ничего не может сделать - например, опросить сокеты и вызвать обратные вызовы.
Итак, если вам нужны как неблокирующие, так и интенсивные вычисления, один из способов сделать это - создать рабочие вилки и использовать неблокирующие каналы для связи между ними и вашим циклом обработки событий, что на самом деле просто для вышеуказанных библиотек.