我的 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/