如何在bash脚本中使用并行编程/多线程?

时间:2013-08-22 15:17:10

标签: multithreading bash parallel-processing fastq

这是我的剧本:

#!/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

目录'source'中有大约30个子目录。每个子目录都有某些 R1 .fastq.gz文件和 R2 .fastq.gz,我想合并到一个R1.fastq.gz和R2.fastq.gz文件,然后将合并的文件保存到目标目录。我的代码工作正常,但由于数据量的原因,我需要加快速度。我只想知道有什么办法可以在我的脚本中实现多线程编程吗?如何运行我的脚本以便多个作业并行运行? bash脚本新手,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:7)

最简单的方法是在后台执行命令,方法是在命令末尾添加&

#!/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 manual

  

如果命令由控制操作符'&'终止,则shell在子shell中异步执行命令。这称为在后台执行命令。 shell不等待命令完成,返回状态为0(true)。当作业控制未激活时(请参阅作业控制),在没有任何显式重定向的情况下,异步命令的标准输入将从/ dev / null重定向。

答案 1 :(得分:3)

我不确定,但您可以尝试在命令末尾使用&,就像这样

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz &