加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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示例代码对我来说也很难理解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读