Это плохая идея написать многопоточный демон сервера TCP на Perl? - PullRequest
3 голосов
/ 05 октября 2009

Это плохая идея писать многопоточные программы (в частности, демоны TCP-сервера) на Perl?

Ответы [ 7 ]

7 голосов
/ 05 октября 2009

Perl - отличный язык для сервера. Если вы приходите в какие-либо области, где интерпретируемый код затягивает работу приложения, вы можете написать код расширения в C для его обработки.

Вы также можете посмотреть на неблокирующий ввод / вывод, чтобы избежать накладных расходов потоков. IO :: Lambda - хороший модуль для этого, упрощая программирование на основе событий для нескольких [анонимных] подпрограмм.

6 голосов
/ 05 октября 2009

Это зависит от используемой вами версии Perl и используемой операционной системы. См. Ошибки и ограничения в perldoc threads.

5 голосов
/ 05 октября 2009

Я бы написал такую ​​вещь с помощью POE , а затем позволил бы POE :: Wheel :: Run при необходимости отключить отдельные процессы.

4 голосов
/ 05 октября 2009

Идите вперед и напишите свой сервер на Perl, используя ithreads. Если дублирование интерпретатора становится бременем, ваша первоначальная реализация служит прототипом, и вы сможете легко перевести логику вашего приложения, скажем, в C См. perldoc perlthrtut.

2 голосов
/ 05 октября 2009

Хотя, возможно, я бы этого не делал. Вы не можете выполнять предварительное порождение потоков, поскольку вы не можете передать новый сокет существующим потокам.

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

Из-за этого я использовал POE и AnyEvent в отдельном проекте, когда мне был нужен сетевой сервер. Они не имеют многопоточной обработки, но, по крайней мере, вы можете обрабатывать несколько соединений несколько вменяемым образом. Они хорошо работают на Windows и Linux, и оба отлично сработали для моих нужд.

1 голос
/ 05 октября 2009

Да, это плохая идея. Вот статья, объясняющая, почему это так: Вещи, которые вам необходимо знать перед программированием Perl ithreads

Вот лишь выдержка из вышеупомянутого поста:

В отличие от большинства других реализаций потоков, существующих в мире, включая более старую реализацию потоков Perl 5.005, переменные по умолчанию не разделяются между потоками Perl. Так что это значит? Это означает, что каждый раз, когда вы запускаете поток, все структуры данных копируются в новый поток. И когда я говорю все, я имею в виду все. Это, например, включает в себя тайники пакетов, глобальные переменные, лексические выражения в области видимости. Все! Пример:

use threads ();
my $foo;
threads->new( sub {print "thread: coderef = ".\$foo."\n"} )->join;
print "  main: coderef = ".\$foo."\n";

который печатает это на моей системе:

thread: coderef = SCALAR(0x1eefb4)
  main: coderef = SCALAR(0x107c90)

Но подождите, вы могли бы сказать, что общие переменные могут быть намного лучше. Так почему бы мне не сделать все переменные общими для моего приложения, чтобы я не страдал от этого. Ну, это не так. Зачем? Потому что общие переменные на самом деле не являются общими. Общие переменные на самом деле являются обычными связанными переменными (со всеми предостережениями и проблемами производительности, связанными с связанными переменными), к которым применяется некоторая «магия». Таким образом, не только общие переменные занимают столько же памяти, сколько «нормальные» переменные, они занимают дополнительную память, потому что вся связанная магия связана с ней. Это также означает, что вы не можете иметь совместно используемые переменные с вашей собственной магией связи (если вы не хотите использовать мой модуль Thread :: Tie).

1 голос
/ 05 октября 2009

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

На мой взгляд, лучшим вариантом будет C / C ++, но в зависимости от ваших навыков и опыта работы с этими языками, вам может быть сложно / долго писать. Я бы посоветовал написать его на Perl (я полагаю, что это ваш язык выбора, основанный на этом вопросе), и если это станет проблемой или у вас возникнут проблемы с производительностью, посмотрите на перенос этого кода на что-то вроде C / C ++.

...