如何在select的父级范围内运行的select case中调用goroutine

时间:2014-01-15 08:04:58

标签: select go channel goroutine

我正在构建一个数据工具,用于收集流中的数据并对其进行操作。我有一个主程序,一个“进程管理器”,负责创建一个累积函数的新例程。管理器被告知基于通道接收选择情况创建例程,它在无限循环中运行(我已经为自己和它创建的所有例程启用了取消例程)。问题是管理器需要能够在其主范围内运行goroutine累加器,以便它们可以在select和for循环范围之外运行(我希望它们在管理器接受新情况时继续运行)。

cancel := make(chan struct{})
chanchannel := make(chan chan datatype)

func operationManager (chanchannel chan chan datatype, cancel chan struct{}) {
for {
 select {
  case newchan := <- chanchannel:
    go runAccum(newchan, cancel)
  case <- cancel:
    return
 }
}
}

func runAccum(inchan chan datatype, cancel chan struct{}) {
for {
 select {
  case data := <- inchan;
    //do something
  case <- cancel:
    return
 }
}
}

这是我用例的一个非常非常愚蠢的例子,但我希望它能说明我的问题的组成部分。如果这是可能的,可行的,合理的,不可取的,请告诉我;不,这不是我实施拆解的方式哈哈

1 个答案:

答案 0 :(得分:1)

没有&#34;范围&#34;到goroutines。所有的goroutine都是平等的。 有&#34;范围&#34;对于封闭,但你的goroutines不跨越封闭。 因此,go runAccum(newchan, cancel)所涵盖的所有goroutine都将像你跨越的任何其他goroutine一样,无论从哪里开始。

我认为你没有测试你的解决方案?