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,实际编写时可以将该值作为一个参数传入。
参考链接
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/124c7b13-c6a7-804f-ba96-d5a936964d8c
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!