num_jobs = 8
i = 0
for submodule in submodules:
submodule_list[i % num_jobs].append(submodule)
i += 1
最后,将每个块(作业)分派给每个线程,并等待所有线程完成:
for i in range(num_jobs):
t = threading.Thread(target=worker, args=(list_submodule_list[i], self.args.path, self.args.command,))
self.__threads.append(t)
t.start()
for i in range(num_jobs):
self.__threads[i].join()
一个简单的、仅限bash的解决方案是这样做的(替换<command with your command>):
IFS=$'\n'
for DIR in $(git submodule foreach -q sh -c pwd); do
cd $DIR && <command> &
done
wait
作为通用命令(创建一个名为“git-foreach-parallel”的文件):
#!/bin/bash
if [ -z "$1" ]; then
echo "Missing Command" >&2
exit 1
fi
IFS=$'\n'
for DIR in $(git submodule foreach -q sh -c pwd); do
cd "$DIR" && "$@" &
done
wait
3条答案
按热度按时间zpjtge221#
我建议您使用基于解释语言多平台(如Python)的解决方案。
进程启动器
首先,您需要定义一个类来管理启动命令的进程。
多线程
下一步是生成多线程执行。Python在它的核心中包含了非常强大的库来处理线程。你可以用它导入下面的包:
在创建线程之前,您需要创建一个工作线程,即为每个线程调用的函数:
正如你所看到的,工人接收到一个子模块列表,为了清晰起见,并且因为它超出了我们的范围,我建议你看一下
.gitmodules
,在那里你可以生成读取文件的子模块列表。💡< Tip >
作为基本方向,您可以在每个子模块中找到以下行:
为此,您可以使用以下正则表达式:
如果正则表达式匹配,则可以在同一行中使用以下表达式获取相对路径:
注意,最后一个正则表达式返回的相对路径在第一个位置有一个空格字符。
💡< / Tip>
然后将子模块列表拆分为与您想要的作业一样多的块:
最后,将每个块(作业)分派给每个线程,并等待所有线程完成:
显然我已经公开了基本概念,但您可以在GitHub中访问parallel_foreach_submodule (PFS)项目的完整实现。
w8f9ii692#
一个简单的、仅限bash的解决方案是这样做的(替换
<command with your command>
):作为通用命令(创建一个名为“git-foreach-parallel”的文件):
zour9fqk3#
如果有人正在寻找一种纯粹的方式来实现它(不要在Docker容器或其他地方安装python),这对我很有帮助
用法示例
git-submodule-foreach-parallel.sh (usage examples run it)