Eu tenho uma tarefa que processa uma lista de arquivos no stdin. O tempo de inicialização do programa é substancial e a quantidade de tempo que cada arquivo leva varia muito. Quero gerar um número substancial desses processos e depois enviar o trabalho para os que não estiverem ocupados. Existem várias ferramentas diferentes de linha de comando que quase fazem o que eu quero, reduzi-o a duas opções quase funcionais:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
O problema é que split
ele faz um round-robin puro, para que um dos processos fique para trás e fique para trás, atrasando a conclusão de toda a operação; enquanto parallel
quer gerar um processo por N linhas ou bytes de entrada e acabo gastando muito tempo na sobrecarga da inicialização.
Existe algo assim que reutilizará os processos e linhas de alimentação para quaisquer processos que tenham stdins desbloqueados?
myjob
está pronta para receber mais informações. Não há como saber que um programa está pronto para processar mais entradas, tudo que você pode saber é que algum buffer em algum lugar (um buffer de pipe, um buffer de stdio) está pronto para receber mais entradas. Você pode providenciar para o seu programa enviar algum tipo de solicitação (por exemplo, exibir um prompt) quando estiver pronto?
read
chamadas faria o truque. Esse é um empreendimento de programação bastante grande.
-l 1
nos parallel
argumentos? IIRC, que diz paralelamente para processar uma linha de entrada por trabalho (ou seja, um nome de arquivo por bifurcação de myjob, com muita sobrecarga de inicialização).
split
comando? O nome entra em conflito com o utilitário de processamento de texto padrão .