免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3022 | 回复: 5
打印 上一主题 下一主题

请教一个Parallel::ForkManager问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-09 11:57 |只看该作者 |倒序浏览
各位好:

我尝试用Parallel::ForkManager去做并发处理,同时ping多个主机,然后将结果记录到变量$global中。

但是执行的结果是,对每台主机的ping操作都完成,但是$global变量一直为空,按照逻辑来说,每次执行ping主机的操作后,都会将结果记录到$global->{$ip}中,所以我的预期是,$global变量一定会有值的。

但是用Parallel::ForkManager之后,$global变量确实没有值,请问一下,是我哪个地方做得有问题?

谢谢!

注:去掉Parallel::ForkManager的几行之后,$global变量就有内容了。

执行结果如下:
[teamsun@dev rcs]$ perl rcs.pl -check -configfile=test

### @lines: [
###           '3.3.3.10',
###           '3.3.3.11',
###           '3.3.3.12'
###         ]
2010-06-09 10:46:27 --- wait for child process
2010-06-09 10:46:27 --- ok, ping 3.3.3.12 sucessful
2010-06-09 10:46:27 --- ok, ping 3.3.3.10 sucessful
2010-06-09 10:46:30 --- error, can not ping 3.3.3.11
2010-06-09 10:46:30 --- $global is empty!

源代码如下:


use strict;
use warnings;
use diagnostics;
use Smart::Comments '###';
use Config;
use Net::Ping::External qw(ping);
use File::Spec::Functions;
use Data::Dumper qw(Dumper);
use Parallel::ForkManager;


my $global;

sub start {
    my @lines;
    ......

    my $pm = new Parallel::ForkManager(300);

    foreach my $ip (@lines) {
        #此处用fork,加快执行速度
        $pm->start and next;
        forkCheck($line);
        $pm->finish;
    }

    notify ( "debug" => "wait for child process");
    $pm->wait_all_children;

    if (defined $global) {
        notify ( "debug" => "write \$global to file");
    }
    else {
        notify ( "error" => "\$global is empty!");
    }


}


sub forkCheck {
    my ($ip) = @_;

    #先PING一下,如果不通,直接跳过
    my $alive =  ping(host => $ip , timeout => 5);
    if ( $alive ) {
        notify ( "debug" => "ok, ping $ip sucessful");
        my %hash = (
            ip          =>  $ip,
            );
        $global->{ok}->{$ip} = { %hash };
    }
    else {
        #退出,记录错误信息,然后继续下一个
        notify ( "debug" => "error, can not ping $ip");
        my %hash = (
            ip          =>  $ip,
            reason      =>  "can not ping $ip",
            );
        $global->{error}->{$ip} = { %hash };
        return;
    }


}

论坛徽章:
0
2 [报告]
发表于 2010-06-09 12:03 |只看该作者
去掉Parallel::ForkManage之后的执行结果是:
$VAR1 = {
          'error' => {
                       '3.3.3.11' => {
                                       'ip' => '3.3.3.11',
                                       'reason' => 'can not ping 3.3.3.11'
                                     }
                     },
          'pingOk' => {
                        '3.3.3.10' => {
                                        'ip' => '3.3.3.10'
                                      },
                        '3.3.3.12' => {
                                        'ip' => '3.3.3.12'
                                      }
                      }
        };

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
3 [报告]
发表于 2010-06-09 13:41 |只看该作者
多进程不能共用一个$global

论坛徽章:
0
4 [报告]
发表于 2010-06-09 14:41 |只看该作者
回复 3# yybmsrs


    谢谢!

请问应该如何解决这个问题呢?

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
5 [报告]
发表于 2010-06-09 15:37 |只看该作者
回复 4# jjqing


    看cpan上的说明可以$pm->finish($code);把$code返给父进程,可以把ping的结果给父进程处理。或者子进程把结果写在一个文件里,然后父进程去读结果。

论坛徽章:
0
6 [报告]
发表于 2010-06-09 16:16 |只看该作者
回复 5# yybmsrs


   
谢谢!
我用Storable试试看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP