Perl中的IO :: Lambda
发布时间:2020-12-16 06:12:35 所属栏目:大数据 来源:网络整理
导读:我已经在一些Perl脚本上卸载了一些维护任务.其中一个要求是并行下载几十个文件(HTTP).我在CPAN上寻找最简单的解决方案,并发现这个模块名为 IO::Lambda::HTTP. 不幸的是,我完全没有函数式编程(以及初学者级Perl经验)的经验,所以虽然我看到所有示例都按照文档
我已经在一些Perl脚本上卸载了一些维护任务.其中一个要求是并行下载几十个文件(HTTP).我在CPAN上寻找最简单的解决方案,并发现这个模块名为
IO::Lambda::HTTP.
不幸的是,我完全没有函数式编程(以及初学者级Perl经验)的经验,所以虽然我看到所有示例都按照文档记录工作,但我无法真正修改它们以满足我的需求. 例如,模块附带的示例: #!/usr/bin/perl # $Id: parallel.pl,v 1.7 2008/05/06 20:41:33 dk Exp $ # # This example fetches two pages in parallel,one with http/1.0 another with # http/1.1 . The idea is to demonstrate three different ways of doing so,by # using object API,and explicit and implicit loop unrolling # use lib qw(./lib); use HTTP::Request; use IO::Lambda qw(:lambda); use IO::Lambda::HTTP qw(http_request); use LWP::ConnCache; my $a = HTTP::Request-> new( GET => "http://www.perl.com/",); $a-> protocol('HTTP/1.1'); $a-> headers-> header( Host => $a-> uri-> host); my @chain = ( $a,HTTP::Request-> new(GET => "http://www.perl.com/"),); sub report { my ( $result) = @_; if ( ref($result) and ref($result) eq 'HTTP::Response') { print "good:",length($result-> content),"n"; } else { print "bad:$resultn"; } # print $result-> content; } my $style; #$style = 'object'; #$style = 'explicit'; $style = 'implicit'; # $IO::Lambda::DEBUG++; # uncomment this to see that it indeed goes parallel if ( $style eq 'object') { ## object API,all references and bindings are explicit sub handle { shift; report(@_); } my $master = IO::Lambda-> new; for ( @chain) { my $lambda = IO::Lambda::HTTP-> new( $_ ); $master-> watch_lambda( $lambda,&;handle); } run IO::Lambda; } elsif ( $style eq 'explicit') { # # Functional API,based on context() calls. context is # $obj and whatever arguments the current call needs,a RPN of sorts. # The context though is not stack in this analogy,because it stays # as is in the callback # # Explicit loop unrolling - we know that we have exactly 2 steps # It's not practical in this case,but it is when a (network) protocol # relies on precise series of reads and writes this lambda { context $chain[0]; http_request &;report; context $chain[1]; http_request &;report; }; this-> wait; } else { # implicit loop - we don't know how many states we need # # also,use 'tail' this lambda { context map { IO::Lambda::HTTP-> new( $_,async_dns => 1 ) } @chain; tails { report $_ for @_ }; }; this-> wait; } 像宣传的那样工作,但我不能为我的生活弄清楚如何修改’对象’或’隐含’的例子限于N个并行实例,如下面的IO :: Lambda的概要: # http://search.cpan.org/~karasik/IO-Lambda/lib/IO/Lambda.pm # crawl for all urls in parallel,but keep 10 parallel connections max print par(10)-> wait(map { http($_) } @hosts); 有人可以给我一个示例,看看在给定上述约束的情况下lambda代码会是什么样的(例如N个实例的限制)? 另外,开始学习函数式编程的最佳方法是什么?这对我来说似乎完全不同寻常. 解决方法
除了IO :: Lambda之外,还有很多其他选项可用于此任务,例如
AnyEvent::HTTP.请参阅
this previous SO question.
即使我熟悉函数式编程,上面的IO :: Lambda示例代码对我来说也很难理解. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |