Hogyan töltsük fel a bash munkafolyamatokat párhuzamosan a GNU-val

A GNU parallelegy parancssori eszköz a feladatok párhuzamos futtatásához.

parallelfantasztikus és minden programozó eszköztárába tartozik. De először kissé elsöprőnek találtam a dokumentumokat. Szerencsére parallelnéhány alapvető paranccsal hasznos lehet .

Miért parallelolyan 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, timeamikor meghívjuk a parancsfájlt a terminálról. timekinyomtatja 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 -azászlóval közvetlenül beilleszthetjük a szkriptünket parallel. parallelminden sort külön parancsként fog futtatni.

parallel -a ./convert.sh

A parallelkonverzió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 paralleladatfeldolgozá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.

parallelaz 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 parallelrö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 ffmpegaz convert.sh.

Cső és húrinterpoláció parallel

Szerencsére parallelad lehetőséget a convert.shteljes 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!