Как мне использовать параллельное программирование / многопоточность в моем скрипте bash?
Это мой сценарий:
#!/bin/bash
#script to loop through directories to merge fastq files
sourcedir=/path/to/source
destdir=/path/to/dest
for f in $sourcedir/*
do
fbase=$(basename "$f")
echo "Inside $fbase"
zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz
done
Здесь есть около 30 подкаталогов в каталоге "источник". В каждом подкаталоге есть определенные файлы R1.fastq.gz и R2.fastq.gz, которые я хочу объединить в один файл R1.fastq.gz и R2.fastq.gz, а затем сохранить объединенный файл в целевой каталог. Мой код работает нормально, но мне нужно ускорить его из-за объема данных. Я просто хочу знать, есть ли способ реализовать многопоточное программирование в моем скрипте? Как я могу запустить свой скрипт, чтобы несколько заданий выполнялись параллельно? Новое в bash-скриптинге, поэтому любая помощь будет принята с благодарностью.
2 ответа
Самый простой способ - выполнить команды в фоновом режиме, добавив &
до конца команды:
#!/bin/bash
#script to loop through directories to merge fastq files
sourcedir=/path/to/source
destdir=/path/to/dest
for f in $sourcedir/*
do
fbase=$(basename "$f")
echo "Inside $fbase"
zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz &
done
Из руководства по bash:
Если команда завершается оператором управления '&', оболочка выполняет команду асинхронно в подоболочке. Это известно как выполнение команды в фоновом режиме. Оболочка не ожидает завершения команды, и возвращается статус 0 (истина). Когда управление заданиями не активно (см. Управление заданиями), стандартный ввод для асинхронных команд при отсутствии явных перенаправлений перенаправляется из /dev/null.
Я не уверен, но вы можете попробовать использовать &
в конце команды, как это
zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz &