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.

[ Hits: 6.940 ]

Por: Bruno Rafael Santos em 05/01/2023 | Blog: https://cutt.ly/4H7vrPh


Uso em scripts



Eu utilizo o Parallel em meus scripts. Ele exige um pouco mais de preparação. Por exemplo, ele precisa executar do ambiente e não do script (limitação similar à do Multiprocessing), logo precisamos exportar a função que será paralelizada.

#!/bin/bash
function main () {
	echo ${@};
	}

export -f main

parallel main {} ::: ${parâmetros};

No código acima, criei uma função main() que será executada em paralelo. Como o parallel chama a função do ambiente, em vez do script, tenho que a exportar com o `export -f main`. Depois é só utilizar o parallel normalmente.

Dominar a chamada de função do Bash ajuda bastante em lidar com o Parallel e entender o que ele está fazendo. Além disto existem alguns parâmetros dele que são interessantes: --bar: mostra uma barra de progresso com estatísticas, bem interessante. --bg: roda em segundo plano e sai. --dry-run: roda sem chamar o comando, bom para testar os parâmetros. --embed: cria um shell script com o uma versão Bash do Parallel que pode ser utilizada em um sistema onde ele esteja ausente. É praticamente o fonte. --eta: mostra o tempo estimado até o fim. --jobs: o número de atividades para rodar em paralelo. Ele conta como porcentagem de núcleos, e por padrão é 100%. --keep-order: entrega resultados na ordem em que recebe, é o equivalente no Multiprocessing a sync e async. O padrão é entregar conforme fica pronto (async). --link: faz com que os parâmetros de entrada sejam lidos par a par. Este último exige um comentário adicional. O Parallel, quando recebe vários parâmetros, gera combinações deles para passar ao comando. Com --link, ele pareia os parâmetros e passa um por um para o comando, que me soa mais natural. Por exemplo:

> (a b c) * (1 2 3) = a1 a2 a3 b1 b2 b3 c1 c2 c3

É uma distribuição algébrica simples. Com --link ficaria:

> (a b c) * (1 2 3) = a1 b2 c3

No caso padrão, os parâmetros podem ter tamanhos diferentes. No caso do --link também, mas ele reciclará a lista menor na medida do possível para garantir que todo mundo tenha um par. Fiquemos atentos:

> (a b c) * ( 1 2 ) = a1 b2 c1

Além disto ele tem todo tipo de opção para lidar com comandos remotos, passar parâmetros nomeados, regex, controlar volumes de memória, controlar número de jobs, introspecção, expansões de nome de arquivo e etc. Depois de instalado basta ler o manual, ele é cheio de exemplos.

man parallel

Ele até te um manual só para exemplos que é tão grande quanto o manual principal dele.

man parallel_examples

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Uso em scripts
   3. Conclusão
Outros artigos deste autor

Guia Rápido do Miniconda para Aplicações Científicas - Instalação e Configuração

Defesa pessoal com o GPG, Nautilus Scripts, partições encriptadas e leves doses de paranoia

Calculando o Imposto de Renda 2015 com o LibreOffice Calc

Tutorial GIMP: Preparando mapas para artigos científicos

getopts: criando scripts Bash com parâmetros e argumentos personalizáveis

Leitura recomendada

flock - Gerenciador de lockfiles

ShellBot - Crie Bots para Telegram em Shell Script

Conheça o projeto BASHSRC

Extracttext - como extrair texto de uma área selecionada da tela

Relatório de conexão Wi-Fi com dados de usuários conectados nos POPs

  
Comentários
[1] Comentário enviado por danniel-lara em 05/01/2023 - 21:32h


Muito bacana o Artigo
parabéns

[2] Comentário enviado por maurixnovatrento em 13/01/2023 - 12:28h


Muito bom artigo.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts