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 $fnn"; ????????}else{ ??????????$0 .= " ".$fn; ??????????print "Geting $fn from $linkn"; ??????????my $cs = getstore($link,$fn); ??????????print "$link downloaded.reponse code:$csn"; ????????} ????????$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_coden"; ??} ); $pm->run_on_start( ??sub { my ($pid,$ident)=@_; ????print "** $ident started,pid: $pidn"; ??} ); $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 $childn"; ??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"; |