Qual é a melhor maneira de executar tarefas em paralelo no Ksh e Perl?
-
05-07-2019 - |
Pergunta
Eu tenho este grande projeto C ++ que eu preciso para construir uma plataforma que não tem um make paralelo (como make -j em Linux). O servidor tem 6 da CPU e eu quero fazer uma compilação paralela manualmente.
posso gerar uma lista de tarefas como este para cerca de 300 arquivos objeto. Eu uso o Makefile para as verificações de dependência e compilação incremental:
make -f Makefile obj1.o
make -f Makefile obj2.o
make -f Makefile obj3.o ...
Como eu poderia executar estas tarefas em paralelo com não mais que 6 tarefas em execução em um tempo usando Ksh e Perl? (Java ou Python não estão disponíveis :-()
Solução
Em Perl o que você deve olhar Paralela :: ForkManager . Você poderia fazer algo parecido com isto:
my @make_obj = qw(
obj1.o
obj2.o
obj3.o
...
);
my $fm = $pm = new Parallel::ForkManager(6);
foreach my $obj (@make_obj) {
$fm->start and next;
system("make -f Makefile $make_obj");
$fm->finish();
}
Outras dicas
Uma alternativa para bifurcação é executar cada marca em seu próprio segmento.
use threads;
my $max_threads = 5;
my @targets = qw(obj1.o obj2.o obj3.o ...);
while(@targets) {
my $num_threads = threads->list(threads::running);
if( $num_threads < $max_threads ) {
my $target = shift @targets;
threads->create(sub { return system "make $target" });
}
}
Estou infelizmente mão acenando em torno de dois bits. Em primeiro lugar está a fazer a espera laço quiescently até que um segmento acabamentos. Eu acredito que este é realizado usando tópicos :: compartilhados das cond_wait () e uma variável de semáforo.
O segundo está recebendo o valor de retorno de marca, então você sabe se algo falhou e para deter a construção. Para fazer isso você tem que juntar () cada thread para obter o resultado de system (), o processo de código de saída.
Desculpe pela resposta precipitada. Esperemos que a comunidade irá preencher o resto.
O gnu make no HPUX não tem a opção -j?
Usando GNU Paralelo você pode escrever:
parallel -j6 make -f Makefile obj{}.o ::: {1..500}
10 segunda instalação:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Saiba mais: http://www.gnu.org/software/parallel/parallel_tutorial .html https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Se o OS está a lidar adequadamente a comunicação inter-processador e programação, você deve apenas ser capaz de jogar todas as marcas em processos backgrounded, contanto que não há interdependências.
Se eles são todos independentes, eu o faria questões uma série de comandos como este:
make -f Makefile obj1.o &
make -f Makefile obj2.o &
...
make -f Makefile objn.o &
Com dependências, corda-los com o comercial duplo (&&
) para que o item dependente não começa até que a sua 'mãe' foi concluída.
Eu percebo que não é bem a solução que você pediu, mas é como eu iria atacar o problema:)