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)