BASH:是否可以在单个 BASH 脚本中对函数进行多线程处理?如果是的话,怎么办?

问题描述 投票:0回答:1

在我的用例中,我有一个单线程备份脚本,从其他经验中我知道硬件可以处理大约 30 倍的 I/O 带宽,并且单线程需要很长时间才能完成它仍然运行到早上工作期间。

问题是,仅后台处理各个 I/O 绑定命令是行不通的,因为后续任务依赖于前一个任务的结果。最重要的是,如果

rsync
报告没有更新,请跳过创建正式备份文件(例如
zip
tar
),以及有关此事的少量报告。还有其他顺序依赖性的情况,但在继续执行该命令集之前获得
rsync
结果至关重要。

过去,我只是通过启动配套脚本来进行多重处理,但随着时间的推移,这已被证明是有问题的,因为随着时间的变化和需求的变化,编辑多个脚本变得容易出错。所以,我想将所有内容都保留在一个脚本中。

我注意到,根据我对文档的阅读,函数可以重定向输入和输出,这让我考虑使用函数或大括号分组和相关机制;也许有一种方法可以将这些相关命令分组,然后将它们设置为背景?

如果是这样,这将是一种“廉价”的多线程 BASH 脚本方式,但即使我输入此内容,我也在想“不”?!这是一个 BASH 实例?!然而,我知道我对 BASH 的许多精彩功能一无所知,所以也许吧?

请注意,我已经考虑过跟踪 pid,它一方面在概念上很简单,但另一方面,它本身并不简单,因为后续 I/O 绑定任务使用相同的上下文(一组论据)。 ...如果这就是我必须做的,...数组等等将在我的未来,将参数与 pid 相匹配! ...我可能会继续使用配套脚本,或者考虑在临时文件中即时编写一个简短的脚本?! -呃!-也不期待那个。

还有别的办法吗?

bash multithreading function background multiprocessing
1个回答
0
投票

在 Bash 中,您可以使用后台进程实现某种形式的并行性,但正如您正确指出的那样,在处理任务之间的依赖关系并协调其结果时,它可能会变得棘手。虽然 Bash 本身不具备传统意义上的多线程原生支持,但您仍然可以使用后台进程和其他机制来实现并行性。

您可以考虑以下几种方法:

后台进程: 您可以使用 & 运算符在后台运行任务,并使用 wait 命令等待任务完成。然而,这种方法可能无法很好地处理依赖关系。

bash 复制代码

在后台运行命令

命令1 & 命令2 & 命令3 &

等待所有后台作业完成

等待 作业控制: Bash 具有作业控制机制,允许您在后台运行多个命令、将它们带到前台并检查它们的状态。您可以使用 bg、fg 和 wait 命令。

bash 复制代码

在后台运行命令

命令1 & 命令2 & 命令3 &

等待所有后台作业完成

等待%1 %2 %3 注意:%1、%2 和 %3 是作业 ID。

GNU 并行: GNU Parallel 是一个可用于并行运行作业的工具。它可以处理任务之间的依赖关系。

bash 复制代码 并行::“命令1”“命令2”“命令3” 如果任何作业失败,您还可以使用 --halt 选项来停止。

bash 复制代码 并行--立即停止,失败=1 :::“命令1”“命令2”“命令3” 参数: xargs 可用于并行化命令。它从管道或命令的输出读取输入,并为每个输入执行命令。

bash 复制代码 echo "命令1 命令2 命令3" | xargs -n 1 -P 3 -n 1 选项确保每次执行每个命令时使用一个参数,-P 3 指定并行进程的数量。

请记住,对于具有依赖性的任务,使用后台进程可能不是最佳解决方案,因为您可能会遇到竞争条件或协调其结果的困难。

对于复杂的场景,您可能会考虑为并行性和并发性而设计的更高级的工具或语言,例如带有多处理模块的Python或使用任务调度程序(如cron)在不同时间调度任务。

© www.soinside.com 2019 - 2024. All rights reserved.