Perl:基于事件和基于并行的风格 - 何时选择?

时间:2011-07-27 07:09:14

标签: perl asynchronous io parallel-processing

如果你知道一个小问题,提出好问题有点困难,但我尽力做到最好。如果我误导你,我道歉。

因此,我试图理解基于事件和基于并行的风格的差异。我读了关于How to articulate the difference between asynchronous and parallel programming?的问题,但无论如何我很困惑。

为什么对我来说非常重要

  正如我所知,

fork()或它的模拟是一种重武器。它复制数据(或   分享它,但在某些情况下最糟糕的是,产生新的过程(可能会死亡)   或者发生了一些不好的事情),将数据返回给我们有很大的问题   “父母”过程等。是的,在CPAN存在一堆好   设计模块来包装这个问题并给我流畅的界面,   但是fork式的任何方式都有一些开销。

     

在这种情况下,正如我所见,我需要遵循简单的规则 - “如果你 CAN 解决你   没有fork()或Parallel :: *你必须使用它的问题,你   应该使用基于事件的解决方案

     

我也可能完全错了吗?

我看到了:

  • 如果我们有IO操作或其他东西,使用外部(对我的程序)事件,如信号,文件已更改或管道中的数据,则应选择基于事件的样式等等

  • 如果我们只有内部(对程序)“事件”,则必须选择基于并行的样式,就像子程序完成计算一样。

换句话说,如果我总是有子程序或类方法/功能,我知道它有一些延迟“内部”(因为很多计算或等待的东西 - 没有区别) - 我必须仅使用基于并行的样式。并且无法使用基于事件的样式,它会不断地工作,因为此代码将阻止主程序并阻止“事件流”。

可以使用基于事件的样式仅当我用“等待内部延迟”编写子程序或类方法/功能时,它在主程序之外调用某些内容时。

是否正确?

修改

这是清除伪代码

# 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 个答案:

答案 0 :(得分:1)

不,你可以随意使用。我不同意“内部”延迟的概念,不同的计算机“部件”之间始终存在延迟,并且它在程序之外是“全部”。但是与磁盘io相比,网络输入/输出速度极慢(与内存/内存相比,速度非常慢......)。

您链接的SO问题的最佳答案提供了一个很好的解释。

如果您想要更好的答案,您必须告诉我们您正在创建的内容或您尝试解决的问题:)

修改

尝试指出正确的方向:

我听说在perl中你应该只是分叉新进程,使用Coro或使用像AnyEvent这样的事件。 POE(参见what is POE?)也可能是您想要的,但它很复杂,而不是您在五分钟内学到的东西。