如果你知道一个小问题,提出好问题有点困难,但我尽力做到最好。如果我误导你,我道歉。
因此,我试图理解基于事件和基于并行的风格的差异。我读了关于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来加速像这样的代码?
答案 0 :(得分:1)
不,你可以随意使用。我不同意“内部”延迟的概念,不同的计算机“部件”之间始终存在延迟,并且它在程序之外是“全部”。但是与磁盘io相比,网络输入/输出速度极慢(与内存/内存相比,速度非常慢......)。
您链接的SO问题的最佳答案提供了一个很好的解释。
如果您想要更好的答案,您必须告诉我们您正在创建的内容或您尝试解决的问题:)
修改强>
尝试指出正确的方向:
我听说在perl中你应该只是分叉新进程,使用Coro或使用像AnyEvent这样的事件。 POE(参见what is POE?)也可能是您想要的,但它很复杂,而不是您在五分钟内学到的东西。