如何在select的父级范围内运行的select案例内调用goroutine

如何在select的父级范围内运行的select案例内调用goroutine,select,go,channel,goroutine,Select,Go,Channel,Goroutine,我正在构建一个数据工具,用于收集流中的数据并对其进行操作。我有一个主例程,一个流程管理器,负责创建累加函数的新例程。经理被告知根据通道接收选择情况创建例程,该情况在无限for循环中运行。我已经为自己和它创建的所有例程创建了取消例程。问题是管理器需要能够在其主作用域中运行goroutine累加器,以便它们能够在select和for循环的作用域之外运行。我希望它们在管理器接受新案例时保持运行 cancel := make(chan struct{}) chanchannel := make(chan

我正在构建一个数据工具,用于收集流中的数据并对其进行操作。我有一个主例程,一个流程管理器,负责创建累加函数的新例程。经理被告知根据通道接收选择情况创建例程,该情况在无限for循环中运行。我已经为自己和它创建的所有例程创建了取消例程。问题是管理器需要能够在其主作用域中运行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
 }
}
}

这是一个非常非常简单的用例示例,但我希望它能说明问题的组成部分。让我知道这是否可能、可行、合理、不可取;不,这不是我实现拆卸的方式哈哈

goroutines没有范围。所有的成功都是平等的。 有闭包的范围,但您的goroutine不跨越闭包。 因此,无论从何处开始,go runAccumnewchan、cancel所跨越的所有goroutine都将像您跨越的任何其他goroutine一样


我想您没有测试您的解决方案?

到底是什么问题?您的示例将在需要时生成新的goroutine,它们将独立于manager循环运行;实际上,我没有意识到go例程只有在整个程序完成的情况下才会关闭,而同一个函数上的go例程执行相同的代码,数据可能不同。goroutine可以访问的数据可以说在其范围内。因此,除非发问者明确要求你回答什么,否则你的回答对IMO没有帮助。我相信我的解释范围和Goroutine本身没有这样的东西是正确的,以运行时使用的特殊Goroutine的一些细节为模块。我的回答试图解释,对于一个函数或goroutines的select或block,没有局部作用域的概念。这种理解可能有助于OP理解为什么所呈现的代码已经完成了它应该做的事情。我认为范围通常用于描述函数、对象、实例等可以访问哪些数据。。。。goroutine的作用域与被调用函数的作用域相同。此函数有一个作用域。因此,我认为goroutines有其存在的范围。虽然你可能是对的,OP的代码已经在做他想做的事情,但我们不知道……也许这是吹毛求疵:goroutine中执行的函数有一些范围——正如你所说的被调用函数或闭包的范围,但是goroutine本身并没有限定范围。是的,我没有测试它,并且一直在错误地处理go例程,谢谢你的回答