Bash 脚本中的多线程概念

Bash 脚本中的多线程概念

我有一个 bash 脚本,它对文件夹中的大量文件执行命令。我如何将多线程效果包含到此脚本中,以便脚本运行得更快?

答案1

使用 GNU Parallel 您可以执行以下操作:

parallel ./myscript.sh --option1 --inputfile {} --outputfile {}.out ::: files*

它将默认每个 CPU 线程并行运行一个作业。

要查看将要运行的内容,请使用--dry-run

parallel --dry-run ./myscript.sh --option1 --inputfile {} --outputfile {}.out ::: files*

GNU Parallel 是一个通用的并行化器,可以轻松地在同一台机器或通过 ssh 访问的多台机器上并行运行作业。

如果你想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

简单调度

当一个进程完成时,GNU Parallel 会生成一个新进程 - 保持 CPU 活跃,从而节省时间:

GNU 并行调度

安装

出于安全原因,您应该使用包管理器安装 GNU Parallel,但如果您的发行版未打包 GNU Parallel,您可以进行个人安装,这不需要 root 访问权限。只需执行以下步骤,10 秒即可完成:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

对于其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多示例:https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-xargs--n1.-Argument-appending

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

阅读本书(至少第 2 章):https://doi.org/10.5281/zenodo.1146014

注册电子邮件列表以获取支持:https://lists.gnu.org/mailman/listinfo/parallel

答案2

我会使用类似软件包parallel中的moreutils程序。它需要一个命令和一个参数列表。默认情况下,它将为每个命令实例输入一个参数,并启动与 CPU 核心数量相同的并行实例。

重要的是,你的工作量可以批量处理。对一堆文件进行单独操作就是一个很好的例子。但是执行同步输出的操作(例如将多个文件添加到单个 zip 中)会更加复杂。

一个很好的例子,改编自该man parallel页面,它通过 UFRAW 处理未知数量的文件,每个 CPU 一个。

parallel ufraw -o processed -- *.NEF

相关内容