I'm trying to model a build concurrent pipeline in a single Bash script. I know I can use other tools, but at this point I'm doing it out of understanding Bash.
并行调度作业很容易,最后等待所有作业也很容易。但我想通过在任务 A.1 和任务 X 之后立即触发任务 A.2 来使其运行得更快。为了让自己变得更困难,任务 A.1 和任务 A.2 中的代码是相关的和连续的,所以如果我也能保持代码的顺序,那就太好了。
#!/usr/bin/bash
{
echo "Task X"
} &
DEPENDENCY=$!
{
echo "Task A.1"
wait "${DEPENDENCY}"
echo "Task A.2"
} &
{
echo "Task B.1"
wait "${DEPENDENCY}"
echo "Task B.2"
} &
wait
这在理想情况下是我想要的,但它不起作用,因为子进程不能互相等待——这是有道理的——但我希望我能以跨平台的方式完成这项工作。
我实际上可以正常工作,但是我无法保留 *.1 和 *.2 部分的代码
如果这可以适用于 OSX 和 Linux,那就太好了。我希望 Bash 专家能够插话并展示在 Bash 中表达这一点的简洁方式。
正如问题的评论所指出的,以下 Makefile 相当于您的 shell 脚本(但不触及文件系统)
.PHONY: a1 a2 b1 b2 x
all: a2 b2
a1:
@echo "Task A.1"
b1:
@echo "Task B.1"
x:
@sleep 1.5; echo "Task X"
a2: a1 x
@echo "Task A.2"
b2: b1 x
@echo "Task B.2"
尝试一下make -j5
以允许五个并行线程。它需要 GNU make,它可用于现有的每个平台,即使它可能不是默认分发的。最初的.PHONY:
target 确保所有任务都被执行,即使文件名为a1
, a2
,...恰好存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)