make:并行运行多个任务并等待完成

swe*_*ber 9 parallel-processing makefile

我的makefile中的一个目标是一个非常耗时且耗时的任务.但我可以分开工作负载并多次并行运行任务,以加快整个过程.

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

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

#!/bin/bash

echo "Sleeping $1 seconds"
sleep $1
echo "$1 are over!"
Run Code Online (Sandbox Code Playgroud)

现在,让我们从bash脚本中调用它,并wait用来等待所有任务完成:

#!/bin/bash

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

wait  # Wait for all tasks to complete

echo "DONE"
Run Code Online (Sandbox Code Playgroud)

输出如预期:

START
Sleeping 15 seconds
Sleeping 5 seconds
Sleeping 10 seconds
5 are over!
10 are over!
15 are over!
DONE
Run Code Online (Sandbox Code Playgroud)

但是在尝试相同的时候Makefile:

test:
    echo "START"
    ./myTask.sh 5 &
    ./myTask.sh 15 &
    ./myTask.sh 10 &
    wait
    echo "DONE"
Run Code Online (Sandbox Code Playgroud)

它不起作用:

START
Sleeping 5 seconds
Sleeping 15 seconds
Sleeping 10 seconds
DONE
sweber@pc:~/testwait $5 are over!
10 are over!
15 are over!
Run Code Online (Sandbox Code Playgroud)

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

Com*_*czy 13

为什么不使用已经内置的机制?像这样的东西:

task%:
        sh task.sh $*

test: task5 task15 task10
        echo "DONE"
Run Code Online (Sandbox Code Playgroud)

您将能够在make命令行上调整并行度,而不是将其硬编码到makefile中(例如,如果您有2个可用核心并且'make -j 32 test',请使用'make -j 2 test'如果你有32个核心)


Mad*_*ist 11

配方中的每个单独的逻辑行都在其自己的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"'
Run Code Online (Sandbox Code Playgroud)

你应该使用分号和反斜杠/换行符在一个shell中运行它以将物理线组合成一个逻辑行:

test:
        echo "START"; \
        ./myTask.sh 5 & \
        ./myTask.sh 15 & \
        ./myTask.sh 10 & \
        wait; \
        echo "DONE"
Run Code Online (Sandbox Code Playgroud)