A GNU parallel
egy parancssori eszköz a feladatok párhuzamos futtatásához.
parallel
fantasztikus és minden programozó eszköztárába tartozik. De először kissé elsöprőnek találtam a dokumentumokat. Szerencsére parallel
néhány alapvető paranccsal hasznos lehet .
Miért parallel
olyan hasznos?
Hasonlítsuk össze ugyanazon számításigényes feladat szekvenciális és párhuzamos végrehajtását.
Képzelje el, hogy van egy mappája .wav audiofájlokból, amelyeket konvertálhat .flac fájlra:

Ezek elég nagy fájlok, mindegyik legalább egy gigabájt.
A fájlok konvertálásához egy másik nagyszerű parancssori eszközt, az ffmpeg-et fogunk használni. Így kell futtatnunk az egyes fájlokat.
ffmpeg -i audio1.wav audio1.flac
Írjunk egy szkriptet, hogy egymás után konvertáljuk őket:
# convert.sh ffmpeg -i audio1.wav audio1.flac ffmpeg -i audio2.wav audio2.flac ffmpeg -i audio3.wav audio3.flac ffmpeg -i audio4.wav audio4.flac ffmpeg -i audio5.wav audio5.flac
Idõzíthetjük egy munka végrehajtását úgy, hogy elõre feltöltjük, time
amikor meghívjuk a parancsfájlt a terminálról. time
kinyomtatja a végrehajtás során eltelt valós időt.
time ./convert.sh
A forgatókönyvünk alig több mint egy perc alatt elkészül.

Nem rossz. De most futtassuk párhuzamosan!
Semmit sem kell változtatnunk a szkriptünkön. A -a
zászlóval közvetlenül beilleszthetjük a szkriptünket parallel
. parallel
minden sort külön parancsként fog futtatni.
parallel -a ./convert.sh
A parallel
konverziónk felhasználásával az idő kicsivel több mint a fele lefutott. Szép!

Csak öt fájllal ez a különbség nem olyan nagy baj. Nagyobb listákkal és hosszabb feladatokkal azonban rengeteg időt takaríthatunk meg parallel
.
Olyan parallel
adatfeldolgozási feladattal dolgoztam, amely valószínűleg egy vagy több órán keresztül futott volna, ha egymást követõen végezzük. Ezzel parallel
, azt csak néhány percig.
parallel
az energia a számítógépétől is függ. A MacBook Pro Intel i7-esének csak 4 magja van. Még ez a kis feladat is a határukra sodorta őket:

A nagyobb teljesítményű számítógépek 8, 16 vagy akár 32 magos processzorokkal rendelkezhetnek, amelyek jelentős időt takaríthatnak meg a munkájuk párhuzamosítása révén.
Hasznos lenni parallel
A másik nagy előnye parallel
rövidsége és egyszerűsége. Kezdjük egy csúnya Python szkripttel, és alakítsuk át tiszta hívásra parallel
.
Itt van egy Python szkript az audiofájl-konvertálás elvégzéséhez:
import subprocess path = Path.home()/'my-data-here' for audio_file in list(path.glob('*.wav')): cmd = ['ffmpeg', '-i', str(audio_file), f'{audio_file.name.split(".")[0]}.flac'] subprocess.run(cmd, stdout=subprocess.PIPE)
Yikes! Valójában sok kódra kell gondolni, csak néhány fájl konvertálásához. (Ez körülbelül 1,2 percet vesz igénybe.)
Konvertáljuk a Pythonunkat a parallel
.
Szkript meghívása a következővel: parallel -a
parallel -a your-script-here.sh
az a szép egybélés, amelyet fentebb használtunk a bash szkriptünk csövezéséhez.
Ez nagyszerű, de megköveteli, hogy írja ki a végrehajtani kívánt bash szkriptet. A mi példánkban is írta ki minden egyes hívás ffmpeg
az convert.sh
.
Cső és húrinterpoláció parallel
Szerencsére parallel
ad lehetőséget a convert.sh
teljes törlésre .
Itt van minden, amit futtatnunk kell a megtérésünk megvalósításához:
ls *.wav | parallel ffmpeg -i {} {.}.flac
Ezt bontsuk le.
Megkapjuk a könyvtárunkban található összes .wav fájl listáját ls *.wav
. Aztán továbbadjuk ( |
) a listát parallel
.
A Parallel néhány hasznos módszert kínál a karakterlánc-interpolációra, ezért a fájl útjainkat helyesen adjuk meg.
The first is {}
, which parallel
automatically replaces with one line from our input.
The second operator is {.}
, which will input one line but with any file extensions removed.
If we expanded the command run by parallel
for our first line of input, we would see...
ffmpeg -i audio1.wav audio1.flac
Args with Parallel
As it turns out, we don’t even need to pipe from ls
to complete our task. We can go simpler still:
parallel ffmpeg -i {} {.}.flac ::: *.wav
Arguments passed to parallel
occur after the command and are separated by :::
. In this case, our argument is *.wav
, which will provide the list of all .wav files in our directory. These files become the input for our blazing-fast parallel
job.
Fun fact: parallel
was built by Ole Tange and published in 2011. According to him, you can use the tool for research without citing the source paper for the modest fee of 10,000 euros!

Thanks for reading!