在golang

时间:2016-06-17 21:29:17

标签: multithreading recursion go parallel-processing tree

我有一个访问节点的二叉树相对较快,除了叶子 - 它们可能慢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?

中实现的递归树多线程算法

2 个答案:

答案 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