我有 150 个 CLI 命令的集合要在我的 12 核机器上的一个文件中执行。在后台运行所有 150 个任务会使系统陷入困境,根据经验,我发现运行 12-18 个任务是最佳的。
过去,我只是使用 split 命令将 150 个命令分割成 12 或 13 块批处理文件,然后运行每一个。然而,有些批处理文件先于其他批处理文件完成,最终我得到了 3 或 4 个批处理文件,比其他批处理文件花费了更长的时间才能完成,而其他 9 或 8 个核心则处于空闲状态。
我的目标是保持所有 12 个内核运行,直到执行完所有 150 个 CLI 命令。
是否可以让每个处理器从 150 个 CLI 命令列表中抓取一个任务,将该命令标记为正在执行,并让其他 11 个处理器抓取自己的项目,直到所有 150 个处理器都完成,而处理器不会互相绊倒并抓取相同的 CLI 命令?写入的文件必须是唯一的。
有什么简单的方法可以做到这一点吗?
答案1
使用 GNU Parallel 看起来像这样:
cat 150commands.txt | parallel
每个核心将运行一项作业。
GNU Parallel 是一个通用并行器,可以轻松地在同一台计算机或多台您可以通过 ssh 访问的计算机上并行运行作业。它通常可以代替for
循环。
如果您想要在 4 个 CPU 上运行 32 个不同的作业,则并行化的直接方法是在每个 CPU 上运行 8 个作业:
相反,GNU Parallel 在完成后会生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:
安装
如果您的发行版未打包 GNU Parallel,您可以进行个人安装,不需要 root 访问权限。这样做可以在 10 秒内完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
对于其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多示例:http://www.gnu.org/software/parallel/man.html
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
浏览本教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel