Normalmente, os pipelines no Unix são usados para conectar dois comandos e usar a saída do primeiro comando como entrada do segundo comando. No entanto, recentemente tive a ideia (que pode não ser nova, mas não encontrei muito pesquisando no Google) de usar o pipeline para executar vários comandos em paralelo, como este:
command1 | command2
Isso invocará command1
e command2
em paralelo se command2
não ler da entrada padrão e command1
não gravar na saída padrão . Um exemplo mínimo para ilustrar isso é (execute-o em um shell interativo)
ls . -R 1>&2|ls . -R
Minha pergunta é: há alguma desvantagem em usar o pipeline para paralelizar a execução de dois comandos dessa maneira? Existe alguma coisa que eu perdi nessa ideia?
Muito obrigado antecipadamente.
Os pipelines de comando já são executados em paralelo. Com o comando:
Ambos
command1
ecommand2
são iniciados. Secommand2
estiver agendado e o pipe estiver vazio, ele bloqueia esperando para ler. Secommand1
tentar escrever no pipe e ele estiver cheio,command1
bloqueie até que haja espaço para escrever. Caso contrário, amboscommand1
ecommand2
executam em paralelo, gravando e lendo do pipe.Existem pontos negativos...
command1
command2
não ler a saída decommand1
, o último travará depois de gravar uma certa quantidade de saída (eu vi 4K, mas experimentalmente o limite é de cerca de 58K, pelo menos para um processo python, veja abaixo). Isso pode depender do tempo de execução usado pelocommand1
.command2
parar antescommand1
ecommand1
gravar em seu stdout, ele obterá[Errno 32] Broken pipe
Experimentar:
cmd1 cmd2Corre:
Você verá:
cmd1
parando na iteração 58 (porque o cmd2 nunca lê nada de sua saída)cmd1
falhando (tubo quebrado) quando o cmd2 saiEntão sim, talvez possa funcionar. E talvez não.