并行执行 Shell 循环,但仅 N 个 worker

并行执行 Shell 循环,但仅 N 个 worker

我们有超过 100 个 git 存储库,有时我想要grep全部覆盖。

要更新 repos,我使用这个:

for repo in *; do (cd $repo; git checkout master; git pull); done

这相当慢。

如何加快速度?

一次运行所有更新会产生太多进程。

我需要一种方法来减少 N 个工人的负担。

有人有解决这个问题的方法吗?

答案1

您可以使用 GNU parallel 来完成此任务。从 GNU parallel 的主页来看,

“作业也可以是从管道读取的命令。GNU parallel 可以拆分输入并将其并行传输到命令中。”

有很好的教程和具体部分解决了您所问的具体问题。

编辑:这是您可以使用的命令。(根据 Ole Tang 的回答略有修改)

parallel -j<number of jobs to run> 'cd {} && git checkout master && git pull' ::: */

这将触发您指定的并行“作业数”并执行您要求执行的任何操作。

高血压

答案2

您可以使用 xargs 来完成这项工作,例如

(for repo in *
    do
    [ -d ${repo} ] && echo ${repo}
    done ) | xargs -I{} -P4 ./gitActions.sh {}

该标志-P4告诉 xargs 最多同时运行 4 个进程,以便您可以使用您想要/需要的进程数量。

然后你的 gitActions.sh 文件应该包含:

#!/bin/bash
repo=$1
cd $repo; git checkout master; git pull

答案3

使用 GNU Parallel 它看起来像这样:

parallel -j77 'cd {} && git checkout master && git pull' ::: */ 

它有77名工人。

GNU Parallel 是一个通用并行化器,可让您在同一台机器或通过 ssh 访问的多台机器上轻松并行运行作业。它通常可以替代循环for

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

简单调度

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

GNU 并行调度

安装

如果您的发行版未包含 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

相关内容