+ -
当前位置:首页 → 问答吧 → [求助] 当Parallel::ForkManager遇到Redo(子程序中)

[求助] 当Parallel::ForkManager遇到Redo(子程序中)

时间:2011-05-07

来源:互联网

小弟接触Perl尚浅,请各位不吝赐教。

因为程序中有用到DBI,所以用Threads不是很顺,于是转而用Parallel::ForkManager。
程序结构大致如:
my $max_process = 22;
my $pm = new Parallel::ForkManager( $max_process );
......#准备各种存放变量的数组array1,array2,......
for(my $jj=0;$jj<=2200;$jj++)
{
    for(my $ii=0;$ii<=22;$ii++)
    {
        $pm->start and next;
        &mycmd($ii,$jj);  # child handles
        $pm->finish;
    }
    $pm->wait_all_children;
}

sub mycmd()
{  my ($i,$j) = @_;
    url = array1[$i].array2[$j];
    my $page=get($url);
    if (!(defined $page)){
    redo;
    }
    ......#写入数据库,处理日志等
}

这里redo的目的是在网络不好的时候重新获取页面。
不过程序在执行的时候(不时)会出现 -
Exiting subroutine via redo at mt.plx line 100.
Cannot start another process while you are in the child process at C:/usr/site/l
ib/Parallel/ForkManager.pm line 463.
同时程序就原地踏步了。

不知道这个是Parallel::ForkManager的本身Bug,还是我在使用中的问题?
那么如何能够解决这个问题呢?

多谢~

作者: cmfuest   发布时间: 2011-05-07

回复 cmfuest


    另一问,曾尝试use threads;但
for(my $jj;$jj<=2200;$jj++)
{
    my @threads;
    for(my $ii=0;$ii<=22;$ii++)
    {
        my $t = threads->new(\&mycmd,$ii,$jj);
        push @threads,$t;
    }
    foreach(@threads)
    {
         $_->join;
    }
}

有时会出现异常 -
Thread 1 terminated abnormally: Undefined subroutine &Dos::CLONE called at line xxxx;
而不用线程执行mycmd()子程序没有问题。

请指教!谢谢~

作者: cmfuest   发布时间: 2011-05-07