关于自定义tool在target之间的并发 #2353
-
我们集成了一个自己的基于clang的工具,原理是对头文件进行一次完整的前端编译,并根据收集到的C++元信息来生成Json元数据库。随后,会使用Python读取类型数据库并生成C++代码,并加入到SourceBatch中进行构建。 我们把一个目标中的所有头文件增量地放入一个源文件中进行编译,借鉴的是xmake内置的unity_build rule的代码,即after_load时收集头文件,所有的生成工作都在on_config时进行(见cpp-reflection)。 但是实际使用中,并发率比较堪忧。python的文本生成很快,不产生问题。但是clang工具对头文件的构建时间很慢。主要原因是无法在target之间进行并发调度,所有的target之间是串行的。而在单一target内的并发提升非常有限,所以需要谋求一个并发处理所有target的办法。 能否找到一个合适的时间点,处理整个依赖图上的目标,从而达到可以在target之间使用task进行并发工具调度的目的?🙏 |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 2 replies
-
目前就 on_build_xxx 相关的任务,是并行处理的,但是 before_build 里面你应该没法处理后续 add files ,滞后了。 而 on_config 目前没做并行,仅仅只是简单的做了串行执行。。要搞成并行也是可以,不过需要花点时间,可以提 feature request 到 issues ,等后面排期 目前配置阶段,在不改 config 的情况下想要并行,也能搞,就是麻烦些。 on_config 里面,走 import 直接统一调用独立的 config 模块 on_config("reflection_config") 然后当前 rule 目录下,搞个 reflection_config.lua ,里面对所有 target,仅仅执行一次,然后用 project.targets 取出所有 targets,走 runjobs 自己搞并行。 import("core.project.project")
import("private.async.runjobs")
function _generate_once()
local targets = project.ordertargets()
local task = function (index)
-- 并行处理 targets
end
runjobs("build", task)
end
function main()
if not _g.generated then
_generate_once()
_g.generated = true
end
end |
Beta Was this translation helpful? Give feedback.
-
另外,我看你也用了 runjobs ,那个目前是 私有接口,主要用于处理依赖图下的并行任务执行,目前不建议外部使用,暂时我还不打算开放,后期可能会有变动 如果只是处理任务并行执行,不用处理依赖关系,那么直接走协程执行就行,开多少个 coroutine task ,都是并行执行的 import("core.base.scheduler")
function task(arg1, arg2)
end
scheduler.co_start(task, arg1, arg2)
scheduler.co_start(task, arg1, arg2)
scheduler.co_start(task, arg1, arg2)
scheduler.co_start(task, arg1, arg2)
... |
Beta Was this translation helpful? Give feedback.
目前就 on_build_xxx 相关的任务,是并行处理的,但是 before_build 里面你应该没法处理后续 add files ,滞后了。
而 on_config 目前没做并行,仅仅只是简单的做了串行执行。。要搞成并行也是可以,不过需要花点时间,可以提 feature request 到 issues ,等后面排期
目前配置阶段,在不改 config 的情况下想要并行,也能搞,就是麻烦些。
on_config 里面,走 import 直接统一调用独立的 config 模块
然后当前 rule 目录下,搞个 reflection_config.lua ,里面对所有 target,仅仅执行一次,然后用 project.targets 取出所有 targets,走 runjobs 自己搞并行。