Shell 使用多线程提交任务-FIFO

2020-12-01  本文已影响0人  caokai001

参考:

学习snakemake,三步轻松搭建生信流程!
linux shell 多线程执行程序
[Linux 1] Shell“ 多线程”,提高工作效率

目前snakemake 对整合生信流程比较友好,shell流程写惯了也还行。感觉在没有作业提交系统的服务器上,使用snakemake 可以很好的控制核心数目,保证服务器可能正常运行,而不是超负荷状态。shell脚本一般都是for循环进行批量,假如存在几百个样本一次批量提交到后台,可能会卡死。


1 顺序执行的代码

#!/bin/bash
date
for i in `seq 1 5`
do
{
    echo "sleep 5"
    sleep 5
}
done
date

结果

Tue Dec  1 14:27:49 CST 2020
sleep 5
sleep 5
sleep 5
sleep 5
sleep 5
Tue Dec  1 14:28:14 CST 2020



2 并行代码

#!/bin/bash
date
for i in `seq 1 5`
do
{
    echo "sleep 5"
    sleep 5
} &
done
wait  ##等待所有子后台进程结束
date

结果

Tue Dec  1 14:29:01 CST 2020
sleep 5
sleep 5
sleep 5
sleep 5
sleep 5
Tue Dec  1 14:29:06 CST 2020



3 对于大量处理任务如何实现启动后台进程的数量可控?

#!/bin/bash
date
for i in `seq 1 3`
do
{


for j in `seq 1 5`
do
{
    echo "$i : sleep 5"
    sleep 5
} &
done
wait  ##等待所有子后台进程结束


}
done
date

结果

Tue Dec  1 14:16:51 CST 2020
1 : sleep 5
1 : sleep 5
1 : sleep 5
1 : sleep 5
1 : sleep 5
2 : sleep 5
2 : sleep 5
2 : sleep 5
2 : sleep 5
2 : sleep 5
3 : sleep 5
3 : sleep 5
3 : sleep 5
3 : sleep 5
3 : sleep 5
Tue Dec  1 14:17:06 CST 2020

4.使用命名管道(fifo)实现每次启动后台进程数量可控。

: 经常需要修改的参数:

#!/bin/bash
# bam to bed

start_time=`date +%s`  #定义脚本运行的开始时间

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile   # 新建一个FIFO类型的文件
exec 6<>$tmp_fifofile  # 将FD6指向FIFO类型
rm $tmp_fifofile  #删也可以,

thread_num=5  # 定义最大线程数

#根据线程总数量设置令牌个数
#事实上就是在fd6中放置了$thread_num个回车符
for ((i=0;i<${thread_num};i++));do
    echo
done >&6

for i in `seq 1 10 ` # 需要处理的所有情况
do
    # 一个read -u6命令执行一次,就从FD6中减去一个回车符,然后向下执行
    # 当FD6中没有回车符时,就停止,从而实现线程数量控制
    read -u6
    {
    
    ### Start 输入自己的命令
        echo "great" # 可以用实际命令代替
        echo "$i is running"
        sleep $i
    ### End 输入自己的命令
        
        
        echo >&6 # 当进程结束以后,再向FD6中加上一个回车符,即补上了read -u6减去的那个
    } &
done

wait # 要有wait,等待所有线程结束

stop_time=`date +%s` # 定义脚本运行的结束时间
echo "TIME:`expr $stop_time - $start_time`" # 输出脚本运行时间

exec 6>&- # 关闭FD6
echo "over" # 表示脚本运行结束

结果:

great
1 is running
great
great
2 is running
3 is running
great
4 is running
great
5 is running
great
6 is running
great
7 is running
great
8 is running
great
9 is running
great
10 is running
TIME:15
over

思考

上一篇 下一篇

猜你喜欢

热点阅读