Sådan overbelastes dine bash-arbejdsgange med parallel GNU
GNU parallel
er et kommandolinjeværktøj til parallelkørsel af job.
parallel
er fantastisk og hører hjemme i værktøjskassen til enhver programmør. Men jeg fandt dokumenterne lidt overvældende i starten. Heldigvis kan du begynde at være nyttig parallel
med blot et par grundlæggende kommandoer.
Hvorfor er parallel
det nyttigt?
Lad os sammenligne sekventiel og parallel udførelse af den samme beregningsintensive opgave.
Forestil dig, at du har en mappe med .wav-lydfiler, du kan konvertere til .flac:

Disse er ret store filer, hver er mindst en gigabyte.
Vi bruger et andet godt kommandolinjeværktøj, ffmpeg, til at konvertere filerne. Her er hvad vi har brug for at køre for hver fil.
ffmpeg -i audio1.wav audio1.flac
Lad os skrive et script for at konvertere hver enkelt sekventielt:
# 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
Vi kan time udførelsen af et job ved at foregribe, time
når vi ringer til scriptet fra terminalen. time
udskriver den forløbne tid, der er gået under udførelsen.
time ./convert.sh
Vores script slutter om lidt over et minut.

Ikke dårligt. Men lad os nu køre det parallelt!
Vi behøver ikke ændre noget ved vores script. Med -a
flag kan vi føre vores script direkte ind i parallel
. parallel
vil køre hver linje som en separat kommando.
parallel -a ./convert.sh
Ved hjælp af parallel
kørte vores konvertering lidt over halvdelen af tiden. Pæn!

Med kun fem filer er denne forskel ikke så meget. Men med større lister og længere opgaver kan vi spare meget tid med parallel
.
Jeg stødte på, parallel
mens jeg arbejdede med en databehandlingsopgave, der sandsynligvis ville have kørt i en time eller mere, hvis den blev gjort sekventielt. Med parallel
det tog det kun et par minutter.
parallel
strøm afhænger også af din computer. Min MacBook Pro's Intel i7 har kun 4 kerner. Selv denne lille opgave skubbede dem alle til deres yderste:

Mere kraftfulde computere kan have processorer med 8, 16 eller endda 32 kerner, hvilket giver massiv tidsbesparelse gennem parallelisering af dine job.
At være nyttigt med parallel
Den anden store fordel ved parallel
er dens korthed og enkelhed. Lad os starte med et grimt Python-script og konvertere det til et rent opkald til parallel
.
Her er et Python-script til at udføre vores lydfilkonvertering:
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! Det er faktisk en masse kode at tænke på bare for at konvertere nogle filer. (Dette tager cirka 1,2 minutter at køre).
Lad os konvertere vores Python til parallel
.
Ringer til et script med parallel -a
parallel -a your-script-here.sh
er den pæne one-liner, vi brugte ovenfor til at pibe i vores bash-script.
Dette er fantastisk, men kræver, at du skriver det bash-script, du vil udføre. I vores eksempel skrev vi stadig ud hvert enkelt opkald til ffmpeg
ind convert.sh
.
Rør og strenginterpolation med parallel
Heldigvis parallel
giver det os en måde at slette convert.sh
helt på.
Her er alt, hvad vi skal køre for at gennemføre vores konvertering:
ls *.wav | parallel ffmpeg -i {} {.}.flac
Lad os nedbryde dette.
Vi får en liste over alle .wav-filer i vores bibliotek med ls *.wav
. Så rør vi ( |
) den liste til parallel
.
Parallel giver nogle nyttige måder at gøre strenginterpolering på, så vores filstier indtastes korrekt.
Den første er {}
, som parallel
automatisk erstattes med en linje fra vores input.
Den anden operatør er {.}
, som vil indtaste en linje, men med eventuelle filtypenavne fjernet.
Hvis vi udvidede kommandoen, der blev kørt parallel
til vores første inputlinje, ville vi se ...
ffmpeg -i audio1.wav audio1.flac
Argumenterer med Parallel
Som det viser sig, behøver vi ikke engang at rør fra for ls
at fuldføre vores opgave. Vi kan stadig være enklere:
parallel ffmpeg -i {} {.}.flac ::: *.wav
Argumenter, der sendes, parallel
forekommer efter kommandoen og adskilles af :::
. I dette tilfælde er vores argument *.wav
, som giver listen over alle .wav-filer i vores bibliotek. Disse filer bliver input til vores lynhurtige parallel
job.
Sjov kendsgerning: parallel
blev bygget af Ole Tange og udgivet i 2011. Ifølge ham kan du bruge værktøjet til forskning uden at nævne kildepapiret til et beskedent gebyr på 10.000 euro!

Tak for læsningen!