Немного трудно задавать хорошие вопросы, если вы немного знаете, но я стараюсь быть лучшим. Приношу свои извинения, если я введу вас в заблуждение.
Итак, я пытаюсь понять общие различия в стиле на основе событий и параллельности. Я прочитал вопрос о Как сформулировать разницу между асинхронным и параллельным программированием? , но все равно я запутался.
Почему это очень важно для меня :
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 для ускорения кода, подобного этому?