makefile - 制作 : Run several tasks in parallel and wait for completion

标签 makefile parallel-processing

我的 makefile 中的一个目标是一项非常消耗 CPU 和耗时的任务。但是我可以拆分工作量并并行运行任务多次以加快整个过程。

我的问题是 make 不会等待所有进程完成。

考虑这个简单的脚本,名为 myTask.sh :

#!/bin/bash

echo "Sleeping $1 seconds"
sleep $1
echo "$1 are over!"

现在,让我们从 bash 脚本调用它,并使用 wait等待所有任务完成:
#!/bin/bash

echo "START"
./myTask.sh 5 &
./myTask.sh 15 &
./myTask.sh 10 &

wait  # Wait for all tasks to complete

echo "DONE"

输出如预期:
START
Sleeping 15 seconds
Sleeping 5 seconds
Sleeping 10 seconds
5 are over!
10 are over!
15 are over!
DONE

但是当在 Makefile 中尝试相同时:
test:
    echo "START"
    ./myTask.sh 5 &
    ./myTask.sh 15 &
    ./myTask.sh 10 &
    wait
    echo "DONE"

它不起作用:
START
Sleeping 5 seconds
Sleeping 15 seconds
Sleeping 10 seconds
DONE
sweber@pc:~/testwait $5 are over!
10 are over!
15 are over!

当然,我可以创建多个可以由 make 并行“构建”的目标,或者让 make 只运行运行任务的 bash 脚本。
但是有没有办法像我已经尝试过的那样做?

最佳答案

配方中的每个单独的逻辑行都在其自己的 shell 中调用。所以你的makefile基本上是运行这个:

test:
        /bin/sh -c 'echo "START"'
        /bin/sh -c './myTask.sh 5 &'
        /bin/sh -c './myTask.sh 15 &'
        /bin/sh -c './myTask.sh 10 &'
        /bin/sh -c 'wait'
        /bin/sh -c 'echo "DONE"'

您应该使用分号和反斜杠/换行符将其全部运行在单个 shell 中,以将物理行合并为一个逻辑行:
test:
        echo "START"; \
        ./myTask.sh 5 & \
        ./myTask.sh 15 & \
        ./myTask.sh 10 & \
        wait; \
        echo "DONE"

关于makefile - 制作 : Run several tasks in parallel and wait for completion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41452476/

相关文章:

c - 解决 "variable ' xxx 的最佳方法已声明但从未被引用”

makefile - 如何在递归构建中忽略命令行变量赋值?

Python Makefile 库

r - listcolumns 和 multidplyr

c - 并行矩阵相乘的问题

c++ - 使用 CUDA 并行化四个或更多嵌套循环

c - 使用Lex统计字符串出现次数,makefile可能出现的问题

linux - Makefile 中的 MD5SUM

c++ - 在并行运行中使用 gcov 的代码覆盖率

multithreading - 对并行Haskell感到困惑