Pergunta

Eu tenho um script que usa Parallel::ForkManager. No entanto, o processo wait_all_children () recebe incrivelmente longo tempo, mesmo depois de todos os processos-filho estão concluídas. A maneira que eu sei é imprimindo algumas marcas de tempo (veja abaixo). Alguém tem alguma idéia do que pode estar causando isso (eu tenho 16 núcleos de CPU na minha máquina)?

my $pm = Parallel::ForkManager->new(16);
for my $i (1..16) {
    $pm->start($i) and next;

    ... do something within the child-process ...

    print (scalar localtime), " Process $i completed.\n";
    $pm->finish();
}
print (scalar localtime), " Waiting for some child process to finish.\n"; 
$pm->wait_all_children();
print (scalar localtime), " All processes finished.\n"; 

Claramente, eu vou passar a mensagem Waiting for some child process to finish em primeiro lugar, com um timestamp de, digamos, 7:08:35. Então eu vou obter uma lista de mensagens Process i completed, com a última no 7:10:30. No entanto, eu não receber o All Processes finished mensagem até 7:16:33 (!). Por que é que demora 6 minutos 07:10:30-07:16:33? Thx!

Foi útil?

Solução

Eu tentei isso:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    printf "%s : Process %d completed\n", scalar localtime, $i;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime; 

eu tenho:

[sinan@archardy Src]$ ./y.pl
Thu Mar 11 17:14:16 2010 : Process 3 completed
Thu Mar 11 17:14:16 2010: Waiting for some child to finish
Thu Mar 11 17:14:18 2010 : Process 8 completed
Thu Mar 11 17:14:18 2010 : Process 14 completed
<snip>...</snip>
Thu Mar 11 17:14:34 2010 : Process 12 completed
Thu Mar 11 17:14:34 2010: All processes finished.

Eu tenho perl 5.10.1 no Linux com Parallel :: ForkManager versão 0.7.5.

Portanto, concluo que qualquer problema que você está tendo está acontecendo como uma conseqüência do que acontece quando você

# ... do something within the child-process ...

Update: O problema é que você está imprimindo a Process finished message antes da chamada do finish. Tente o seguinte versão:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);
$pm->run_on_finish( sub {
    printf "%s : Process completed: @_\n", scalar localtime
});

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime;

Callbacks em paralelo :: ForkManager documentação para obter mais informações. Se as desaparece atraso, em seguida, o sintoma que você está observando deveu-se ao fato de que você estava reivindicando o processo bifurcada tinha terminado antes de ter sido feito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top