Procesamiento en paralelo con xargs
A medida que nuestra biblioteca continúa expandiéndose, queremos acelerar el procesamiento de nuestros archivos. Para tareas que son independientes entre sí, ejecutarlas en paralelo puede reducir significativamente el tiempo total de ejecución. La opción -P de xargs nos permite ejecutar múltiples instancias del comando de destino simultáneamente, lo que mejora considerablemente el rendimiento en operaciones limitadas por E/S o tareas que implican esperas. Esta es una ventaja clave de xargs frente al procesamiento secuencial simple con un bucle for.
Primero, vamos a crear un script que simule el procesamiento de un libro añadiendo una marca de tiempo a su contenido e introduciendo un retraso. Este retraso nos ayudará a visualizar la ejecución en paralelo.
cat ~/project/process_book.sh
Deberías ver:
#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## Simulate some processing time
Este script hace lo siguiente:
- Toma un título de libro como argumento (
$1).
- Crea un nuevo archivo con el prefijo "processed_" antes del título del libro.
- Escribe un mensaje en este archivo, incluyendo la fecha y hora actuales.
- Espera 2 segundos para simular tiempo de procesamiento, haciendo que la ejecución paralela sea más evidente.
Ahora, usemos xargs con la opción -P para procesar los libros en paralelo. También usaremos la opción -I nuevamente para pasar cada título de libro como argumento a nuestro script.
cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}
Desglosemos este comando:
cat ~/project/more_books.txt: Lee nuestra lista de libros.
|: Envía la salida a xargs.
xargs -P 3: Indica a xargs que ejecute hasta 3 procesos en paralelo. xargs lanzará hasta 3 instancias del comando de destino simultáneamente, cada una procesando uno o más elementos de entrada.
-I {}: Define {} como el marcador de posición para cada elemento de entrada, que se pasará como argumento a nuestro script.
~/project/process_book.sh {}: Es el comando a ejecutar para cada libro, con {} reemplazado por el título del libro.
Este comando comenzará a procesar hasta 3 libros simultáneamente. Después de ejecutarlo, puedes comprobar el contenido de los archivos procesados:
cat ~/project/processed_*
Deberías ver una salida que muestra que los libros fueron procesados en momentos ligeramente diferentes, lo que indica la ejecución en paralelo. Los tiempos exactos variarán, pero podrías ver algo como esto:
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
Observa cómo los tres primeros libros comienzan a procesarse al mismo tiempo, y los dos últimos comienzan unos 2 segundos después (debido al sleep 2 en nuestro script). Esto demuestra el procesamiento en paralelo en acción, una ventaja significativa de usar xargs para acelerar tareas independientes.