2013-05-14 2 views
4

Я написал сценарий, который включает в себя генерацию gcov в параллель. Я преуспел в этом, но он создает 17 дочерних процессов за раз. Но я хочу создать только 6 дочерних процессов за раз, 7-й ребенок должен создать после 1child процесс завершается.Как ограничить дочерний процесс в perl?

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.               
+0

List1 содержит .. массив компонентов @ iucall, @ uerrc и т.д ... Каждый массив содержит компонент files.For 1-й 6 компонент работает нормально, но после того, что он пропуская альтернативные компоненты – Nethra

+0

ваш вызов 'wait()' в строке 36 кажется сомнительным: строки 26-35 составляют код для дочерних процессов, правильно? ни один из них не должен ждать каких-либо других дочерних процессов, просто потому, что у него нет дочерних процессов. таким образом, он блокируется, и, следовательно, родительский процесс не получит никакого сигнала завершения. я задаюсь вопросом, завершается ли ваш скрипт вообще. – collapsar

ответ

7

Я думаю, вы могли бы использовать 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; 
    }; 
+0

Пользователь хочет только 6 дочерних процессов, а не 17. Невозможно сделать редактирование, так как его слишком мало символов. Хороший ответ. –

+0

Это сделано. – Nethra

+0

Но конечный результат не является точным, если все 6 дочерних процессов используют один и тот же каталог temp, но не получают доступ к одному и тому же файлу, создаст ли он какие-либо проблемы? – Nethra

Смежные вопросы