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

参考:

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

发现shell也可以支持多线程提交,就记录下来。

Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能

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 并行代码

使用'&'+wait 实现“多进程”实现

#!/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 对于大量处理任务如何实现启动后台进程的数量可控?

简单的方法可以使用2层for/while循环实现,每次wait内层循环的多个后台程序执行完成。

但是这种方式的问题是,如果内层循环有“慢节点”可能导致整个任务的执行执行时间长。

#!/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)实现每次启动后台进程数量可控。

注: 经常需要修改的参数:

thread_num=5 # 定义最大线程数

修改自己的任务

0ee29c255fe8

image.png

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

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

思考

一般情况下集群有PBS系统,不需要这么麻烦限制任务提交数目,或者CPU核心数目

snakemake比较容易解决核心问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值