GNU Parallel: criando atividades em paralelo com shell script
No tutorial de hoje falarei sobre o GNU Parallel, uma ferramenta fantástica para quem utiliza Shell Script. O Parallel é um utilitário GNU que permite incluir alguma forma de paralelismo nos scripts, melhorando significativamente a performance em sistemas multinúcleo. Seu funcionamento é simples, e lembra um pouco o módulo Multiprocessing do Python.
Introdução
Curiosamente, a primeira menção ao Parallel aqui no VOL vem de uma dica de de 2012. Até o momento, ele não é distribuído por padrão em todas as distribuições e precisa ser instalado manualmente. Felizmente, esta disponível nativamente na maioria dos repositórios.
No Fedora 37, o nome do pacote é "parallel":
dnf install parallel
Depois disto ele pode ser utilizado em qualquer script ou comando, diretamente do Bash ou shell script.
parallel cmd {} ::: parâmetros;
Vejamos os elementos um por um:
Notem que a sintaxe é excessivamente simples. Os parâmetros podem ser vários, eles serão substituídos na ordem em que forem dados. E podem ter tamanhos diferentes, o Parallel cuida de distribuir as combinações. Por exemplo, considere os seguintes parâmetros, que lhes mostro como um array:
Notem que os parâmetros devem ser passados já em sua forma expandida. Para globs isso é bem óbvio, para variáveis, pode ser um desafio. Notem também que o Parallel entende expansões, globs e listas de parâmetros nativamente:
parallel echo {} ::: 1 2 3 ::: a b c
O comando acima dá no mesmo que o anterior, tem mais cara de bash escrito interativamente. Em ambos os dados, o Parallel passará para o echo todas as combinações possíveis dos parâmetros cobrindo o máximo possível de possibilidades.
O que o comando recebe é algo muito parecido com a lista típica de parâmetros que um script receberia, por isso, não importando quantos parâmetros são dados, somente uma entrada é dada. O comando acima é o mais comum, outras possibilidades são:
Notem que no último comando não é necessário passar uma entrada, e o operador é :::: com quatro caracteres.

dnf install parallel
Depois disto ele pode ser utilizado em qualquer script ou comando, diretamente do Bash ou shell script.
Sintaxe
Ele é relativamente fácil de utilizar e tão bem documentado que tem desde cheatsheet a livro sobre ele. Mas o funcionamento é bem simples. Um comando básico no Parallel tem a seguinte estrutura:parallel cmd {} ::: parâmetros;
Vejamos os elementos um por um:
- cmd: é um comando que possa ser chamado no shell.
- {}: é um parâmetro que possa ser necessário para o comando.
- ::: á um operador indicando que o próximo item é um parâmetro.
- parâmetros: é uma lista de parâmetros que podem ser chamados.
Notem que a sintaxe é excessivamente simples. Os parâmetros podem ser vários, eles serão substituídos na ordem em que forem dados. E podem ter tamanhos diferentes, o Parallel cuida de distribuir as combinações. Por exemplo, considere os seguintes parâmetros, que lhes mostro como um array:
#!/bin/bash
x=(a b c);
y=(1 2 3);
parallel echo {} ::: x{[@]} ::: ${y[@]};
Notem que os parâmetros devem ser passados já em sua forma expandida. Para globs isso é bem óbvio, para variáveis, pode ser um desafio. Notem também que o Parallel entende expansões, globs e listas de parâmetros nativamente:
parallel echo {} ::: 1 2 3 ::: a b c
O comando acima dá no mesmo que o anterior, tem mais cara de bash escrito interativamente. Em ambos os dados, o Parallel passará para o echo todas as combinações possíveis dos parâmetros cobrindo o máximo possível de possibilidades.
O que o comando recebe é algo muito parecido com a lista típica de parâmetros que um script receberia, por isso, não importando quantos parâmetros são dados, somente uma entrada é dada. O comando acima é o mais comum, outras possibilidades são:
#!/bin/bash parallel --arg-file dados.txt echo; cat dados.txt | parallel echo; parallel echo :::: dados.txt;
Notem que no último comando não é necessário passar uma entrada, e o operador é :::: com quatro caracteres.
Muito bacana o Artigo
parabéns