Processamento Paralelo com xargs
À medida que nossa biblioteca continua a expandir, queremos acelerar nosso processamento de arquivos. Para tarefas que são independentes umas das outras, executá-las em paralelo pode reduzir significativamente o tempo total de execução. A opção -P do xargs permite executar múltiplas instâncias do comando de destino simultaneamente, o que pode melhorar drasticamente o desempenho para operações limitadas por E/S (I/O-bound) ou tarefas que envolvem espera. Esta é uma vantagem fundamental do xargs sobre o processamento sequencial simples com um loop for.
Primeiro, vamos criar um script que simula o processamento de um livro, adicionando um carimbo de data/hora ao seu conteúdo e introduzindo um atraso. Esse atraso nos ajudará a visualizar a execução paralela.
cat ~/project/process_book.sh
Você deverá ver:
#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## Simulate some processing time
Este script faz o seguinte:
- Recebe um título de livro como argumento (
$1).
- Cria um novo arquivo com o prefixo "processed_" no título do livro.
- Escreve uma mensagem neste arquivo, incluindo a data e hora atuais.
- Aguarda por 2 segundos para simular um tempo de processamento, tornando a execução paralela mais evidente.
Agora, vamos usar o xargs com a opção -P para processar os livros em paralelo. Também usaremos a opção -I novamente para passar cada título de livro como um argumento para o nosso script.
cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}
Vamos detalhar este comando:
cat ~/project/more_books.txt: Lê nossa lista de livros.
|: O pipe envia a saída para o xargs.
xargs -P 3: Diz ao xargs para executar até 3 processos em paralelo. O xargs iniciará até 3 instâncias do comando de destino simultaneamente, cada uma processando um ou mais itens de entrada.
-I {}: Define {} como um marcador para cada item de entrada, que será passado como argumento para o nosso script.
~/project/process_book.sh {}: O comando a ser executado para cada livro, com {} substituído pelo título do livro.
Este comando começará a processar até 3 livros simultaneamente. Após executar o comando, você pode verificar o conteúdo dos arquivos processados:
cat ~/project/processed_*
Você deverá ver uma saída mostrando que os livros foram processados em horários ligeiramente diferentes, indicando a execução paralela. Os horários exatos variarão, mas você poderá ver algo como:
Processing Pride_and_Prejudice at Mon Aug 12 10:15:01 UTC 2024
Processing The_Catcher_in_the_Rye at Mon Aug 12 10:15:01 UTC 2024
Processing The_Hobbit at Mon Aug 12 10:15:01 UTC 2024
Processing Animal_Farm at Mon Aug 12 10:15:03 UTC 2024
Processing Brave_New_World at Mon Aug 12 10:15:03 UTC 2024
Observe como os três primeiros livros começam a ser processados ao mesmo tempo, e os dois últimos começam cerca de 2 segundos depois (devido ao sleep 2 em nosso script). Isso demonstra o processamento paralelo em ação, uma vantagem significativa do uso do xargs para acelerar tarefas independentes.