如何用 Shell 脚本实现任务并行处理:理解和运用 & 和 wait
最编程
2024-07-25 18:51:52
...
文章目录
- 概述
- 常见的串行执行
- 使用&和wait改造
- 示例二
概述
我们知道shell中的命令都是串行执行的,如果想要充分利用服务器的资源,就需要些小技巧了。
假定业务上多个业务逻辑没有先后关系,每个脚本的执行时间也很长 ,推荐并行执行。
一般情况下,我们会把每个业务逻辑写到一个单独的脚本里,在服务器上逐一调用,每次都要手工去敲命令。
如果我们把这些脚本放到一个调用脚本里呢? 执行的时候去调用这个调用脚本,事实上linux会根据脚本中的顺序 串行去调用这些脚本,还不如自己在服务器上一个个的执行快呢,最起码手工逐个调用脚本还是并行的。
常见的串行执行
我们通过一个例子来演示下:
使用1.sh和2.sh模拟业务逻辑
[root@artisan test]# cat 1.sh
#!/bin/bash
echo "1.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang duang~~~"
sleep 5s
echo "1.sh 执行结束....."
[root@artisan test]# cat 2.sh
#!/bin/bash
echo "2.sh 开始执行....."
echo "模拟业务逻辑,sleep 5秒, duang duang duang~~~"
sleep 5s
echo "2.sh 执行结束....."
[root@artisan test]#
我们将调用脚本放到 call_serial.sh
[root@artisan test]# cat call_serial.sh
#!/bin/bash
#当前目录下执行如下脚本 相对路径
./1.sh
./2.sh
echo "继续执行剩下的逻辑..."
[root@artisan test]#
执行call_serial.sh
call_serial.sh 可知为【串行】
使用&和wait改造
- 在每个进程中使用&符号进行让脚本在后台运行,无需等待当前进程结束。
- 为了确保每个进程都执行完成,最后务必使用wait关键字,用来确保每一个子进程都执行完成。
[root@artisan test]# cat call_parallel.sh
#!/bin/bash
#当前目录下执行如下脚本 相对路径
./1.sh &
./2.sh &
wait
echo "继续执行剩下的逻辑..."
[root@artisan test]#
执行下看看效果
call_parallel.sh 可知为【并行】
通过上述的改造,可以大大的提高多个进程并发执行的效率。 对于可以同时执行的业务逻辑,可以充分利用主机资源,减少等待时间。
示例二
serial.sh
#!/bin/bash
beginTime=`date +%s`
num=1
for i in `seq 1 3`
do
echo $i "业务逻辑 开始执行,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
sleep 2s
echo $i "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
echo "-----------------------------------------------------------"
done
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"
从执行结果来看,串行,每个进程都要耗时2秒,3个进程6秒处理完成
使用&和wait关键字来改造上上述脚本,使其并行执行
parallel.sh
#!/bin/bash
beginTime=`date +%s`
num=1
for i in `seq 1 3`
do
{
echo $i "业务逻辑 开始执行,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
sleep 2s
echo $i "业务逻辑 执行完成,当前时间:" `date "+%Y-%m-%d %H:%M:%S"`
echo "-----------------------------------------------------------"
# 结尾的&确保每个进程后台执行
}&
done
# wait关键字确保每一个子进程都执行完成
wait
endTime=`date +%s`
echo "总共耗时:" $(($endTime-$beginTime)) "秒"
从执行结果来看,并行,同时启动3个进程,3个进程2秒处理完成。
推荐阅读
-
【摩尔线程+Colossal-AI强强联手】MusaBert登上CLUE榜单TOP10:技术细节揭秘 - 技术实力:摩尔线程凭借"软硬兼备"的技术底蕴,让MusaBert得以从底层优化到顶层。其内置多功能GPU配备AI加速和并行计算模块,提供了全面的AI与科学计算支持,为AI推理和低资源条件下的大模型训练等场景带来了高效、经济且环保的算力。 - 算法层面亮点:依托Colossal-AI AI大模型开发系统,MusaBert在训练过程中展现出了卓越的并行性能与易用性,特别在预处理阶段对DataLoader进行了优化,适应低资源环境高效处理海量数据。同时,通过精细的建模优化、领域内数据增强以及Adan优化器等手段,挖掘和展示了预训练语言模型出色的语义理解潜力。基于MusaBert,摩尔线程自主研发的MusaSim通过对比学习方法微调,结合百万对标注数据,MusaSim在多个任务如语义相似度、意图识别和情绪分析中均表现出色。 - 数据资源丰富:MusaBert除了自家高质量语义相似数据外,还融合了悟道开源200GB数据、CLUE社区80GB数据,以及浪潮公司提供的1TB高质量数据,保证模型即便在较小规模下仍具备良好性能。 当前,MusaBert已成功应用于摩尔线程的智能客服与数字人项目,并广泛服务于语义相似度、情绪识别、阅读理解与声韵识别等领域。为了降低大模型开发和应用难度,MusaBert及其相关高质量模型代码已在Colossal-AI仓库开源,可快速训练优质中文BERT模型。同时,通过摩尔线程与潞晨科技的深度合作,仅需一张多功能GPU单卡便能高效训练MusaBert或更大规模的GPT2模型,显著降低预训练成本,进一步推动双方在低资源大模型训练领域的共享目标。 MusaBert荣登CLUE榜单TOP10,象征着摩尔线程与潞晨科技联合研发团队在中文预训练研究领域的领先地位。展望未来,双方将携手探索更大规模的自然语言模型研究,充分运用上游数据资源,产出更为强大的模型并开源。持续强化在摩尔线程多功能GPU上的大模型训练能力,特别是在消费级显卡等低资源环境下,致力于降低使用大模型训练的门槛与成本,推动人工智能更加普惠。而潞晨科技作为重要合作伙伴,将继续发挥关键作用。
-
如何用 Shell 脚本实现任务并行处理:理解和运用 & 和 wait
-
南邮OJ Web任务大揭秘:层层挑战剖析 1. 挑战一:迷宫般的目录探索 题目作者似乎穷举了所有可能的目录组合,最终在404.php中的