当前位置: 首页 > 知识库问答 >
问题:

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

薛泰
2023-03-14

我的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脚本。但是有没有办法做得更像我已经尝试过的?

共有2个答案

倪鸿禧
2023-03-14

配方中的每个逻辑行都在其自己的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"
丌官承
2023-03-14

为什么不使用make中已经内置的机制呢?大概是这样的:

task%:
        sh task.sh $*

test: task5 task15 task10
        echo "DONE"

您将能够在make命令行上调整并行级别,而不是将其硬编码到makefile中(例如,如果有2个内核可用,则使用“make-j2 test”,如果有32个内核,则使用“make-j2 test”)

 类似资料:
  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 我有大约5个与从HTTP获取数据以及基于数据处理和生成结果相关的任务。 我希望并行运行这些任务,并等待所有任务成功完成或其中一个任务失败。每个任务都应该能够发布失败原因。如果其中一项任务失败,那么所有任务都将被视为失败,并在不等待所有任务完成的情况下退出。 我试图使用完整的未来和未来列表来实现它,但它不起作用,代码也不能很好地发布。 我有没有更好的方法来实现它?以身作则会有所帮助。

  • 我正在尝试将bash脚本迁移到Python。 bash脚本并行运行多个OS命令,然后在继续之前等待它们完成,即: 命令 我希望使用Python子进程实现同样的目标。这可能吗?如何等待subprocess.call命令完成后再继续?

  • 使用asyn/wait vs wait有什么区别task.run() 等待任务。运行示例- 异步等待示例-

  • 问题内容: 我有以下使用类的课程。所以我想做的是,在运行cp1实例处理方法的同时,我要并行运行。 但是,我要按顺序cp1,所以我要它运行并完成,如果cp2没有完成或失败,那就很好。如果确实失败,我想加入结果。该示例中未返回任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗?还是线程? 我只希望cp2与cp1并行运行。或者,如果我添加更多内容,例如说cp3,我希望它也可以与cp1并

  • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样