美文网首页
Linux | parallel 并行1

Linux | parallel 并行1

作者: iBioinformatics | 来源:发表于2023-03-28 13:15 被阅读0次

    参考资料:
    http://serverfault.com/questions/374131/how-to-run-multiple-shell-scripts-in-parallel

    一、安装

    1. Debian 或 Ubuntu Linux 安装
    sudo apt install parallel
    
    
    2. RHEL/CentOS Linux 安装
    sudo yum install parallel
    
    
    3. Fedora Linux 安装
    sudo dnf install parallel
    
    
    4. 使用conda安装(推荐),这种方法在macos上面也可以使用
    conda install -c conda-forge parallel
    或
    conda install -c conda-forge/label/cf201901 parallel
    
    parallel --help
    
    

    直接安装

    wget -c https://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2 
    tar -jxvf parallel-latest.tar.bz2
    cd parallel-20190622
    cat README
    mkdir $HOME/parallel
    ./configure --prefix=$HOME/parallel&& make && make install
    # $HOME/parallel/自定义安装路径
    
    $HOME/parallel/bin/parallel --help
    
    
    
    
    vim ~/.bashrc
    export PATH=/home/qmcui/parallel/bin:$PATH
    . ~/.bashrc
    

    参数解释

    Usage:
    
    parallel [options] [command [arguments]] < list_of_arguments
    parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))...
    cat ... | parallel --pipe [options] [command [arguments]]
    
    常用选项:
    ::: 后面接参数
    :::: 后面接文件
    -j、--jobs   并行任务数
    -N  每次输入的参数数量
    --xargs会在一行中输入尽可能多的参数
    -xapply 从每一个源获取一个参数(或文件一行)
    --header  把每一行输入中的第一个值做为参数名
    -m   表示每个job不重复输出“背景”(context)
    -X   与-m相反,会重复输出“背景文本”
    -q  保护后面的命令
    --trim  lr 去除参数两头的空格,只能去除空格,换行符和tab都不能去除
    --keep-order/-k   强制使输出与参数保持顺序 --keep-order/-k
    --tmpdir/ --results   都是保存文件,但是后者可以有结构的保存
    --delay  延迟每个任务启动时间
    --halt  终止任务
    --pipe    该参数使得我们可以将输入(stdin)分为多块(block)
    --block  参数可以指定每块的大小
    
    

    二、使用

    1. ::: 传递参数

    $ parallel echo ::: a b | tee a.txt
    a
    b
    
    $ parallel echo ::: A B ::: C D| tee b.txt
    A C
    A D
    B C
    B D
    
    $  parallel -a a.txt -a b.txt echo
    a A C
    a A D
    a B C
    a B D
    b A C
    b A D
    b B C
    b B D
    

    同:

    cat a.txt |parallel -a - -a b.txt echo
    -标准输入符,缓存占位符
    
    # 同:
    cat a.txt | parallel echo :::: - b.txt
    
    # 同: 
    parallel echo ::: a b c d e :::: b.txt 
    
    parallel --xapply echo ::: A B  :::  C D
    A C
    B D
    
    parallel --xapply echo {1} {2} ::: A B ::: C D
    A C
    B D
    
    parallel --xapply echo {2} {1} ::: A B ::: C D
    C A
    D B
    

    GNU Parallel使用 --no-run-if-empty 来跳过空行:

    $ (echo 1; echo; echo 2) | parallel --no-run-if-empty echo
    1
    2
    
    
    
    $ (echo 1; echo; echo 2) | parallel echo
    1
    
    2
    

    2. :::: 将参数/命令储存到文件里,然后以文件名传递参数/命令

    #传参数
    cat > parameter.txt
    A
    B
    C
    
    parallel echo :::: parameter.txt
    A
    B
    C
    
    parallel --dryrun echo :::: parameter.txt
    echo A
    echo B
    echo C
    
    #传命令
    for i in A B C
    do
        echo echo ${i} >> command.txt
    done
    
    cat command.txt
    echo A
    echo B
    echo C
    
    parallel --dryrun :::: command.txt
    echo A
    echo B
    echo C
    
    parallel :::: command.txt
    A
    B
    C
    
    

    3. 关于大括号的使用

    • 如上当传递多个参数时,使用{数字}形式可以灵活指定参数的位置
    • 当参数为文件名(带路径)时,大括号的特殊用法可以实现巧妙组合
    #组成字符串
    parallel echo chr{}.fa ::: {1..5} X Y
    chr1.fa
    chr2.fa
    chr3.fa
    chr4.fa
    chr5.fa
    chrX.fa
    chrY.fa
    
    
    parallel echo cp {} {.}.test ::: ./*.txt
    #  cp ./a.txt ./a.test
    #  cp ./b.txt ./b.test
    
    
    #如果只有一个参数,使用大括号即可指代该参数。如下,与上面命令等价
    parallel echo cp {1} {1.}.test ::: ./*.txt
    
    
    • 大括号的妙用
      {} – full name 全名
      {.} – one less file extension 以(最后一个)逗号为分隔符的前半部分
      {/} – remove directory path 去除路径
      {//} – directory path 仅保留路径
      {/..} – remove directory path and two levels of file extension
    echo dir1/dir2/file.txt.gz | parallel --plus 'echo -e {}\\n{.}\\n{/}\\n{//}\\n{/..}'
    #  dir1/dir2/file.txt.gz
    #  dir1/dir2/file.txt
    #  file.txt.gz
    #  dir1/dir2
    #  file
    
    

    三、其他

    示例 1

    需求分析:假设我们有三个进程A和B和C,分别对应三个运行脚本a.sh,b.sh,c.sh。 A和B两个进程是完全独立的。C进行必须等待A进程和B进程都运行结束之后,才能启动C进程。

    串联【不理想】:

    a.sh;
    b.sh;
    c.sh;
    

    如果这三个进程都要运行特别长的时间,如果10个小时左右。运行总时间就需要30个小时。

    解决方法:因为我们知道A和B是相互独立的所以我们应该将A和B并联起来,然后再和C串联。这样运行时间就优化成了20个小时。

    并联的话我们不能使用后台运行的方式,如果将A或者B后台运行了,C需要等待A和B都运行结束了才启动,但是C不知道A和B什么时候结束。

    parallel -j 2 "sh a.sh" "sh b.sh";
    sh c.sh
    

    这样A和B就通过parallel来进行并联,等到A和B都运行结束了,parallel这个命令也就运行结束。然后再进行C程序。(满足我们的要求)

    参考链接:
    https://blog.csdn.net/wuyanyi/article/details/14647641
    https://www.jianshu.com/p/e8cb9f0fc173
    https://www.jianshu.com/p/936d0bc52ad5

    相关文章

      网友评论

          本文标题:Linux | parallel 并行1

          本文链接:https://www.haomeiwen.com/subject/yufqfdtx.html