Bash脚本实现批量作业并行化

Linux下运行作业时经常会遇到以下情形有大量作业需要运行完成每个作业所需要的时间也不是很长如果我们以串行方式来运行这些作业可能要耗费较长的时间若采用并行方式运行则可以大大节约运行时间再者目前的计算机绝大部分都是多核架构要想充分发挥它们的计算能力也需要并行化总结网上看到的资料利用Bash脚本,可以采用下面几种方法实现批量作业的并行化注意下面论述中将不会区分进程和线程也不会区分并行和并发.

1. 采用GNUparalle程序

parallelGNU专门用于并行化的一个程序对于简单的批量作业并行化非常合适使用parallel不需要编写脚本只需在原命令的基础上简单地加上parallel就可以了所以,如果能用paralle并行化你的作业请优先使用有关paralle的详细说明请参考其官方文档.

2. 最简单的并行化方法:&+wait

利用Bash的后台运行&wait函数可实现最简单的批量作业并行化.

如下面的代码串行执行大约需要10

改为下面的简单并行代码理想情况下可将运行时间压缩到3秒左右

3. 进程数可控的并行化方法(1): 模拟队列

使用Bash脚本同时运行多个进程并无困难主要存在的问题是如何控制同时运行的进程数目上面的简单并行化方法使用时进程数无法控制因而功能有限因为大多数时候我们需要运行的作业数远远超过可用处理器数这种情况下若大量作业同时在后台运行,会导致运行速度变慢并行效率大大下降一种简单的解决方案就是模拟一个限定最大进程数的队列以进程PID做为队列元素每隔一定时间检查队列若队列中有作业完成,则添加新的作业到队列中这种方法还可以避免由于不同作业耗时不同而产生的无用等待下面是根据网上的代码改写的一种实现实用性更强的代码参考原文.

一个更简洁的方法是记录PID到数组通过检查PID存在与否以确定作业是否运行完毕.可实现如下

3. 进程数可控的并行化方法(2): 命名管道

上面的并行化方法也可利用命名管道来实现命名管道是Linux下进程间进行通讯的一种方法也称为先入先出(fifo,first in first out)文件具体方法是创建一个fifo文件作为进程池里面存放一定数目的"令牌".作业运行规则如下所有作业排队依次领取令牌;每个作业运行前从进程池中领取一块令牌完成后再归还令牌当进程池中没有令牌时,要运行的作业只能等待这样就能保证同时运行的作业数等于令牌数前面的模拟队列方法实际就是以PID作为令牌的实现.

据我已查看的资料这种方法在网络上讨论最多实现也很简洁但理解其代码需要的Linux知识较多下面是我改写的示例代码及其注释.

注意:

(1) exec6<>$Pfifo 这一句很重要若无此语句$Pfifo写入数据时程序会被阻塞,直到有read读出了文件中的数据为止而执行了此语句就可以在程序运行期间不断向文件写入数据而不会阻塞并且数据会被保存下来以供read读出.

(2) $Pfifo中已经没有数据时,read无法读到数据进程会被阻塞在read操作上直到有子进程运行结束,向$Pfifo写入一行.

(3) 核心执行部分也可使用如下方式

{}()的区别在shell是否会衍生子进程


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值