Perl: основанный на событиях и параллельный стиль - когда выбрать один? - PullRequest
4 голосов
/ 27 июля 2011

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

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

Почему это очень важно для меня :

fork () или его аналог - тяжелое оружие, насколько я знаю. Это скопировать данные (или поделиться им, но в некоторых случаях это хуже), породить новый процесс (который может умереть или что-то плохое случилось), есть огромная проблема, чтобы вернуть данные «родительский» процесс и тд. Да, на CPAN существует куча хороших разработаны модули, чтобы обернуть эту проблему и дать мне гладкий интерфейс, но в любом случае в стиле форка есть некоторые накладные расходы.

В этом случае, как я вижу, мне нужно следовать правилу - ", если вы CAN решите вас проблема без fork () или Parallel :: * you НЕ ДОЛЖНА использовать его, вы СЛЕДУЕТ использовать вместо этого основанные на событиях решения"

Может быть, я тоже совершенно не прав?

Правильно ли я вижу:

  • стиль, основанный на событиях, следует выбирать, если у нас есть операции ввода-вывода или что-то подобное, с использованием события external (для моей программы), например, изменения сигнала или файла, или данных в конвейере и итак

  • параллельный стиль должен быть выбран, если у нас есть только внутреннее (для программы) «событие», как вычисляется завершение подпрограммы.

Другими словами, если у меня всегда есть подпрограмма или метод / функция класса, и я знаю, что у нее есть некоторая задержка «внутри» (потому что много вычислений или ожидание чего-то - разницы нет) - I должен использовать только параллельный стиль. И нет никакого способа использовать его в стиле событий, он будет работать непрерывно, потому что этот код заблокирует основную программу и заблокирует «поток событий».

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

Это правильно?

EDIT:

это псевдокод для очистки

# we are CANT re-write this methods, but we are known it`s have latency
sub method_with_latency_as_blackbox1{...};
sub method_with_latency_as_blackbox2{...};

my @in_data = (2,3,5);
my @out_data;

# we are need to run this for each item in @in_data array, somehow
# and there we are CAN re-write code to speed up it
# by somehow "separating" all block execution for each item
# and not method_1* from method_2* - it`s impossible because it related 
foreach my $ent ( @in_data ){
  my $res1 = method_with_latency_as_blackbox1( $ent );
  my $res2 = method_with_latency_as_blackbox2( $ent, $res1 ); # yes, it related
  push @out_data, $res2; # we are not care about result position
}

как я могу использовать AnyEvent или Coro для ускорения кода, подобного этому?

1 Ответ

1 голос
/ 27 июля 2011

Нет, вы можете использовать все, что вы хотите.Я не согласен с понятием «внутренней» задержки, всегда существует задержка между различными «частями» компьютера, и это «все» вне вашей программы.Но сетевой ввод / вывод очень медленный по сравнению с диском io (который очень медленный по сравнению с памятью / оперативной памятью и т. Д.).

Лучший ответ на вопрос SO, который вы связали, дает хорошее объяснение.

Если вы хотите получить лучший ответ, вам нужно сообщить нам, что вы создаете или какую проблему вы пытаетесь решить:)

Редактировать:

Чтобы попытаться направить вас в правильном направлении:

Я слышал, что в Perl вы должны либо просто разветвлять новые процессы, использовать Coro или использовать что-то на основе событий, например AnyEvent .POE (см. что такое POE? ) также может быть тем, что вы хотите, но оно сложное, а не то, что вы изучаете за пять минут.

...