multithreading - Makefile目标运行并行目标,并在完成更多工作之前等待它们完成

标签 multithreading makefile threadpool gnu-make

我试图让“父目标”等待“平行子目标”完成,然后再在“父目标”的“ body ”中进行操作。

在以下示例中,消息@echo "Print this only after *ALL* the previous PARALLEL tasks are done!"应该在所有目标foo-task1foo-task2foo-task3完成之后仅打印

如果我在那些“ child 目标” 的末尾删除与号(&),则它们将变成串行,但这不是预期的行为。它们的行为应类似于“线程池”或“进程池”。我事先不知道哪个目标将最后完成,所以我无法从瓶颈目标中删除“&”号(&)。

这些目标表示对远程REST API的HTTP调用,这可能需要花费不同的时间才能完成。我想等待这些“并行REST调用”查看它们是否成功,然后在foo-parallel中打印最终消息。

这些“并行目标”正在返回stdout/stderr,因此我希望父目标可以等待它们并在出现某些错误的情况下失败。

我该怎么办?

foo-task1:
    @bash -c 'sleep 1 && echo "task1" &'

foo-task2:
    @bash -c 'sleep 1 && echo "task2" &'

foo-task3:
    @bash -c 'sleep 2 && echo "task3" &'

foo-parallel: foo-task3 foo-task2 foo-task1
    @echo "Print this only after *ALL* the previous PARALLEL tasks are done!"

命令make版本:
$ make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

编辑:

这与目标定义略有不同(我更改了sleep的时间只是为了确保消息以延迟的顺序而不是代码中的顺序打印):
foo-parallel:
    @bash -c 'sleep 5 && echo "task1" & \
                        sleep 1 && echo "task2" & \
                        sleep 2 && echo "task3" & \
                        wait; \
                        echo "done here!"'

打印:
$ make foo-parallel 
task2
task3
task1
done here!

但是我需要将所有task1task2task3的逻辑放在同一个目标中。我想将这些任务划分为不同的目标。

最佳答案

如果不使用make的-j选项,则无法执行此操作。默认情况下,make构建一个目标,等待其完成,然后构建下一个目标。仅使用-j,它将支持同时运行的多个目标。

foo-parallel: foo-task3 foo-task2 foo-task1
        @echo "Print this only after *ALL* the previous PARALLEL tasks are done!"

foo-task1:
        @sleep 1 && echo "task1"

foo-task2:
        @sleep 1 && echo "task2"

foo-task3:
        @sleep 2 && echo "task3"

然后运行:make -j或如果您想限制并行构建的数量,请使用make -j2或任意多个。

如果您真的想避免键入-j,则可以使用递归make:
foo-parallel:
        @$(MAKE) -j foo-task1 foo-task2 foo-task3
        @echo "Print this only after *ALL* the previous PARALLEL tasks are done!"

foo-task1:
        @sleep 1 && echo "task1"

foo-task2:
        @sleep 1 && echo "task2"

foo-task3:
        @sleep 2 && echo "task3"

但是,如果有人确实调用make -j,这可能会引起奇怪的警告。通常,我认为最好由调用make的人来决定他们对特定系统想要多少并行性。

关于multithreading - Makefile目标运行并行目标,并在完成更多工作之前等待它们完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52973417/

相关文章:

c - 多线程程序中的意外输出

r - clusterExport到R并行中的单线程

vb.net - Visual Basic 2008 - 不同线程上的新窗体

c# - 如果在原始数据访问周围只使用 lock 关键字,是否有可能在 C# 中创建死锁?

asp.net - asp.net IIS 7.0 或更高版本中 maxConcurrentThreadsPerCPU 的默认值是多少?

c# - 确保ThreadPool中的任务执行顺序

html - 将 HTML 文本分配给 NSAttributedString 会在全局队列上抛出 EXC_BAD_ACESS

c++ - Make/gcc 神秘错误 2 : how to have more information?

Linux 模块 makefile 编译错误

makefile - 如何在 automake 中编写自定义静默规则?