Perl的并行任务管理模块使用方法

Perl的Parallel::ForkManager是用来管理进程创建的模块,据说它可以做到根据各个CPU当前的负载决定在哪颗CPU上fork进程。

#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;
use LWP::Simple;
my @array = (
          'http://mirrors.163.com/centos/5.5/os/i386/CentOS/Cluster_Administration-as-IN-5.2-1.el5.centos.noarch.rpm',
          'http://mirrors.163.com/centos/5.5/os/i386/CentOS/Cluster_Administration-hi-IN-5.2-1.el5.centos.noarch.rpm',
          'http://mirrors.163.com/centos/5.5/os/i386/CentOS/Global_File_System-or-IN-5.2-1.el5.centos.noarch.rpm',
          'http://mirrors.163.com/centos/5.5/os/i386/CentOS/Virtualization-it-IT-5.2-11.el5.centos.noarch.rpm',
          'http://mirrors.163.com/centos/5.5/os/x86_64/CentOS/Global_File_System-zh-CN-5.2-1.el5.centos.noarch.rpm',
          'http://121.207.250.132/my/mybt_5520_client.exe',
          'http://dl.91.com/my/my_5520_client.exe',
          'ftp://download1.91.com/my/my_5520_client.exe',
          'ftp://download2.91.com/jz/jz_3560_client.exe',
          'http://dl.91.com/ty/TY_1328_client.exe',
          'ftp://download2.91.com/kx/kx_3500_client.exe',
          'http://www.sina.com/',
          'http://www.qq.com/'
);
my $max_process = 5;
my $pm = new Parallel::ForkManager( $max_process );
foreach my $link (@array){
        $pm->start and next;
        my ($fn) = $link =~ /^.*\/(.*?)$/;
        if (!$fn) {
          warn "Can not determine filename from $fn\n";
        }else{
          $0 .= " ".$fn;
          print "Geting $fn from $link\n";
          my $cs = getstore($link,$fn);
          print "$link downloaded.reponse code:$cs\n";
        }
        $pm->finish;
}

程序中提供了一个URL文件列表,使用Parallel::ForkManager创建多个进程同时下载,最大进程数为5。用ps命令查看系统进程如下所示:
/usr/sbin/sshd
      4718  0.0  0.2  10084  2860 ?        Ss   02:35   0:00  \_ sshd: @ 
      4720  0.0  0.1   4916  1484     Ss   02:35   0:00  |   \_ -bash
      3301  1.8  0.4   6668  4784     S+   03:57   0:00  |       \_ perl 1.pl
      3308  8.0  0.7   9632  7484     S+   03:57   0:00  |           \_ 1.pl my_5520_client.exe
      3309  5.6  0.6   9168  7088     S+   03:57   0:00  |           \_ 1.pl my_5520_client.exe
      3310  3.3  0.6   9168  7088     S+   03:57   0:00  |           \_ 1.pl jz_3560_client.exe
      3311  7.3  0.7   9632  7484     S+   03:57   0:00  |           \_ 1.pl TY_1328_client.exe
      3312  8.0  0.6   9172  7088     S+   03:57   0:00  |           \_ 1.pl kx_3500_client.exe
另外,介绍三个函数
run_on_finish   子进程finish之后调用的函数
run_on_start 子进程start之后调用的函数
run_on_wait 当子进程需要等待时自动调用的函数
例程:

#!/usr/bin/perl -w
use lib '.';
use strict;
use Parallel::ForkManager;
my $max_procs = 5;
my @names = qw( Fred Jim Lily Steve Jessica Bob Dave Christine Rico Sara );
# hash to resolve PID's back to child specific information
my $pm = new Parallel::ForkManager($max_procs);
# Setup a callback for when a child finishes up so we can
# get it's exit code
$pm->run_on_finish(
  sub { my ($pid, $exit_code, $ident) = @_;
    print "** $ident just got out of the pool ".
      "with PID $pid and exit code: $exit_code\n";
  }
);
$pm->run_on_start(
  sub { my ($pid,$ident)=@_;
    print "** $ident started, pid: $pid\n";
  }
);
$pm->run_on_wait(
  sub {
    print "** Have to wait for one children ...\n"
  },
  0.5,
);
foreach my $child ( 0 .. $#names ) {
  my $pid = $pm->start($names[$child]) and next;
  # This code is the child process
  print "This is $names[$child], Child number $child\n";
  sleep ( 2 * $child );
  print "$names[$child], Child $child is about to get out...\n";
  sleep 1;
  $pm->finish($child); # pass an exit code to finish
}
print "Waiting for Children...\n";
$pm->wait_all_children;
print "Everybody is out of the pool!\n";


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值