На практике иногда создается впечатление, что модуль Thread::Signal способствует не повышению, а понижению стабильности программ, в зависимости от применяемой версии Perl и библиотеки поддержки многопоточной обработки. Рекомендуется при проведении экспериментов с многопоточными средствами вначале написать программу без модуля Thread::Signal и ввести его позже, если будут происходить непредвиденные сбои или другие странные явления.
Многопоточный психотерапевтический сервер.
Несмотря на то, что потокам было посвящено такое длинное введение, фактически код многопоточного сервера весьма невелик по объему. Ниже приведена многопоточная версия психотерапевтического сервера.
#!/usг/local/bin/per! -w # Файл: eliza_thread.pl use strict; use IO::Socket; use Thread; use Chatbpt::Eliza::Server; use constant PORT =>12000; my $listen_socket = IO::Socket::INET->new ( LocalPort =>PORT, Listen => 20, Proto => 'tcp', Reuse => 1); die $@ unless $listen_socket; warn "Listening for conneсtions … n"; while (my $connection = $listen_socket->accept) { Thread->new (&interact, $connection); } sub interact { my $ handle = shift; Thread->self->detach; Chatbot::Eliza::Server->new->command interface($handle , $handle); $handle->close(); }
Проведем анализ программы.
Строки 1-5. Загрузка модулей. Выполнение программы начинается с загрузки модулей IO::Socket и Thread. Вызывается также специализированная версия модули Chatbot::Eliza, в которой метод command_interface () был откорректирован для работы в многопоточной среде.
Строки 6-12. Создание приемного сокета. Как и в предыдущих примерах, создается новый приемный сокет с помощью метода IO::Socket::lNET->new (). Если приемный сокет не может быть создан, вызывается функция die и выводится сообщение об ошибке, оставленное модулем IO::Socket в переменной $@.