type
status
date
slug
summary
tags
category
icon
password

前言


在默认情况下shell脚本中的命令是串行执行的,虽然shell脚本的执行效率高,但是当任务量巨大的时候仍然需要较长的时间,尤其是需要执行一大批的命令时。
在这种情况下,我们可以采用“并发”的方式执行这些命令,这样可以更好的利用系统资源,提升运行效率,缩短脚本的执行时间。
当然当命令之间存在复杂的交互关系时,那么情况会十分复杂,这时则不建议使用shell脚本来完成多线程的实现。
“并发”执行shell脚本适用于同一类命令多次执行的情景,以提高执行效率。
 

实例


该部分以polardb数据库copy命令的并行执行为例来展示shell并发控制的方法。

未使用并发的脚本

如下方代码所示,PHASE2部分重复使用copy命令串行加载数据至数据库,显然,我们可以进行并行处理以提高效率。

方案1:使用&符号将命令放入后台执行

在shell脚本中,&符号用于将命令放入后台执行。这意味着该命令会在后台运行,允许脚本继续执行后面的命令,而不会阻塞当前的命令。

方案2:命令后台运行+wait命令使脚本暂停执行

wait命令的作用是使脚本暂停执行,直到所有后台进程完成,是用于管理并行进程的一个重要工具。

方案3:使用文件描述符控制并发数(待定)

方案4:使用xargs -P控制并发数

xargs命令有一个-P参数,表示支持的最大进程数,默认为1。为0时表示尽可能地大,即方案2的效果。

方案5:使用GNU parallel命令控制并发数

GNU parallel命令是非常强大的并行计算命令,使用-j参数控制其并发数量。
 

总结


shell脚本并行控制的方案:
  • 方案1:使用"&"使命令后台运行
  • 方案2:命令后台运行+wait命令
  • 方案3:使用文件描述符控制并发数
  • 方案4:使用xargs -P控制并发数
  • 方案5:使用GNU parallel命令控制并发数
“多线程”的好处不言而喻,虽然shell中并没有真正的多线程,但上述解决方案可以实现“多线程”的效果,重要的是,在实际编写脚本时应有这样的考虑和实现。
另外:
方案3、4、5虽然都可以控制并发数量,但方案3显然写起来太繁琐。
方案4和5都以非常简洁的形式完成了控制并发数的效果,但由于方案5的parallel命令非常强大,所以十分建议系统学习下。
方案3、4、5设置的并发数均为5,实际编写时可以将该值作为一个参数传入。
 

参考链接


 
💡
有关问题,欢迎您在底部评论区留言,一起交流~
OS:内存管理那些年我在环境配置上走过的坑
Loading...
Koreyoshi
Koreyoshi
一个无可救药的乐观主义者
Latest posts
Linux程序设计:shell编程
2025-4-10
软件测试:面向对象的测试
2025-4-10
OFCA-OpenHarmony认证
2025-4-10
ICT编程赛
2025-4-10
现代C++核心准则(上)
2025-4-10
现代C++核心准则(下)
2025-4-10
Announcement
🎉写给自己的2025心愿🎉
保研
国奖
完善博客
学一门乐器
发表一篇论文
拍摄人生照片
去3个城市旅游
专业课知识视频
拍摄毕业季视频
----- 2025 ------
👏希望我们一起变好👏