Как мне использовать параллельное программирование / многопоточность в моем скрипте 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 &
Другие вопросы по тегам