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

如何限制perl中的子进程?

发布时间:2020-12-16 06:19:00 所属栏目:大数据 来源:网络整理
导读:我编写了一个脚本,其中包括并行生成gcov.我成功了,但它一次创建了17个子进程.但我想一次只创建6个子进程,第7个子进程终止后应该创建第7个子进程. sub gcov_parallel() 2 { 3 print "Generating Gcov...n"; 4 my $kid; 5 my $pid; 6 @list = (@iucall,@iurca
我编写了一个脚本,其中包括并行生成gcov.我成功了,但它一次创建了17个子进程.但我想一次只创建6个子进程,第7个子进程终止后应该创建第7个子进程.

sub gcov_parallel()
  2 {
  3     print "Generating Gcov...n";
  4     my $kid;
  5     my $pid;
  6     @list = (@iucall,@iurcall_init,@iurcall_term,@iurcall_uti,@nob,@nobcch,@nobcell,@nobrrc,@nobcall,@rnccall,@cellin
    fo,@rnccom,@cellrrm,@uerrm,@uerrc,@uecall,@iupcded);
  7     my $len_list = scalar(@list);
  8     my $maxlen =0;
  9     my $count = 0;
 10     my $process = 0;
 11     $total_components = scalar(@comp_list);
 12
 13     for(my $comp_count=0; $comp_count < $len_list ; ($comp_count=$comp_count+$no_of_machines))
 14     {
 15         #limiting child process to 6
 16         if($process == 6)
 17         {
 18             $pid = wait();
 19             $process=$process-1;
 20         }
 21         else
 22         {
 23             $pid = fork();
 24             if($pid eq 0)
 25             {
 26                 for(my $files_count = 0; $files_count < $no_of_machines; $files_count++)
 27                 {
 28                     $count =  $files_count+$comp_count;
 29                     if($count < $len_list)
 30                     {
 31                         chomp($list[$count]);
 32                         my @list_gcda =`ls $list[$count]/*.gcda | sort`;
&generate_gcov("$list[$count]",@list_gcda);
 34                     }
 35                 }
 36                 wait();
 37                 exit;
 38             }
 39             $process=$process+1;
 40         }
 41     }
 42     do
 43     {
 44         $kid = waitpid(-1,0);
 45     }while $kid > 0;
 46 }

But i observed while running the script it is skipping files while generating gcov.

解决方法

我想你可以使用 Paralel::ForkManager来做到这一点.

有一个good tutorial on PerlMonks about Paralel::ForkManager.

可能就是这么简单:

my $manager = Parallel::ForkManager->new( 6 );
   foreach my $command (@commands) {
      $manager->start and next;
      system( $command );
      $manager->finish;
   };

(编辑:李大同)

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

    推荐文章
      热点阅读