我有一个访问节点的二叉树相对较快,除了叶子 - 它们可能慢100-1000倍。我有一个递归算法,我想在go中实现(我是新手)。
因为我必须要从并行性中获益,我需要在树中更高并行化执行。这虽然可能导致数百万的goroutines。用信号量来限制这一点似乎不是“去”。方式 - 没有这样的同步原语。我所担心的另一个问题是,实际上,如果我使用等待组,那么它是多么昂贵。
我的树是抽象的,算法在它上面运行,按级别和索引识别项目。
// l3 0
// / \
// l2 0 1
// / \ / \
// l1 0 1 2 3
// / \ / \ / \ / \
// l0 0 1 2 3 4 5 6 7
例如,我可以使用它来计算向量中所有项目的总和:
func Sum(level, index int, items []int) int {
if level == 0 {return items[index]}
return Sum(level-1, index*2, items) + Sum(level-1, index*2+1, items)
}
我的方法应该是什么?有人能指出我在go?
中实现的递归树多线程算法答案 0 :(得分:1)
听起来你需要一个工人池。这是我刚才写的一个例子:https://play.golang.org/p/NRM0yyQi8X
isDone
答案 1 :(得分:0)
我强烈建议从上到下阅读这篇优秀博客文章:
https://blog.golang.org/pipelines
它不仅涵盖 完全 您需要的示例(例如parallelized file-tree walk calculating MD5 file checksums),还包括 更多:
- 扇入/扇出频道技术
- 并行
- 通过完成频道取消管道
- 通过错误频道链接的管道错误
- 有界并行
最后一个主题,有界并行,用于确保行走'大节点目录树不会创建过多的例程:bounded.go