怎么在循环里实现部分并发

用循环处理一个Vector中的各个元素,如果各个元素无依赖关系的话,可以用多线程来加速

Threads.@threads for obj in vecobj
    do_sth_to(obj)
end

或者

@sync for obj in vecobj
    @async do_sth_to(obj)
end

但是如果 vecobj 里的元素之间存在部分依赖的话,比如 vecobj = [A, B, C], 其中 B 与 C 相互独立且都依赖于 A, 那么在处理 vecobj 时,可以先处理元素 A , 再同时处理 B 与 C,这样可以实现部分并发,从而加速计算。

所以该怎么设计这个多线程来实现这个需求呢?可能大致应该这样:

Threads.@threads for obj in vecobj
    wait_utill_has_no_dependencies(obj)
    do_sth_to(obj)
end

这个 wait_utill_has_no_dependencies 怎么实现呢? 谢谢!

这里其实就是个方案,@threads 把循环的数据并行,不允许并行的放外边

但是依赖关系是动态的,并不是静态的,例子可以稍微复杂化点, vecobj = [A, B, C, D, E] , 依赖关系为(箭头指向父节点)
image

  • 串行执行的话是:A-B-C-D-E 大概 5 个单位时间结束
  • 部分并发的话是:A执行完后,B/C并发执行,B/C结束后,D/E也可以异步执行,大概 3 个单位时间结束

https://juliaparallel.org/Dagger.jl/dev/