Procesamiento paralelo sencillo con xargs

4 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy Munou.
Siento que haya pasado tanto tiempo desde mi última publicación, pero estoy vivo.

Compré un Ryzen 5 de segunda mano y, sorprendentemente, tenía pines doblados, y solo reconocía una ranura de memoria, lo que causó algunos problemas, pero de alguna manera sigo adelante.
Conseguí otra placa base AM4 M-ATX barata, así que estoy pensando en usar ese chip Ryzen para construir un mini PC.

El útil xargs

xargs - Wikipedia
El comando xargs, que existe como un comando UNIX, es muy útil.
Al principio no estaba acostumbrado a usarlo, pero cuanto más lo uso, más utilidades encuentro; es un comando excelente que incluso elimina la necesidad de escribir bucles simples en una sola línea.

Caso de Uso

Por ejemplo, supongamos que tienes videos que quieres guardar con yt-dlp, y cada uno está en una línea.

url1
url2
url3

Si lo pasas a un procesamiento paralelo masivo, la carga de la CPU se disparará, así que si quieres ejecutarlo de dos procesos en dos procesos, puedes escribirlo de la siguiente manera.

cat url-txt | xargs -I {} -P 2 yt-dlp {}

¡Con esto solo, puedes procesar dos procesos a la vez!

Desglosemos esto

Entonces, ¿cómo funciona esto?
Lo anterior es equivalente a lo siguiente:

yt-dlp url1 ; yt-dlp url2
yt-dlp url3

En términos de mecanismo, el comando pasado a xargs se ejecuta cada vez.
¿Es como si leyera una línea (read line) y la almacenara como un array?

¿Qué pasa si no hay opciones?

Si no hay opciones, se pasa el comando a xargs de una sola vez.
Dado que los comandos compatibles son limitados, creo que es mejor usar la opción -I.
En un caso como el siguiente:

cat url-txt | xargs yt-dlp

En este caso, se habría ejecutado el siguiente comando:

yt-dlp url1 url2 url3

Por lo tanto, parece mejor procesar con -I siempre que sea posible, pero en algunos puntos, también podría estar bien sin opciones.

Caso de Uso 2

También es útil cuando quieres usar grep o sed solo en archivos con nombres específicos usando el comando find.

find . -name "testfile" | xargs -I {} grep "return 0" {}

De esta manera, es posible usar grep solo en archivos específicos con una descripción tan corta.


Eso es todo por hoy.
Hasta la próxima.

Related Posts