pyr*_*ids 2 concurrency channel go race-condition goroutine
我理解通常,如果我希望从Go例程访问范围外的变量,我有责任创建一个由Go例程概念上拥有的副本.这对渠道也是如此,还是免除?
有效的Go #channels用"这可能看起来很奇怪,req := req但在Go中这是一个[原文如此]的法律和惯用语"解释了这一点,指的是这个代码示例:
var sem = make(chan int, MaxOutstanding)
// (other code, filling sem, defining process(..), etc., omitted)
func Serve(queue chan *Request) {
for req := range queue {
<-sem
req := req // Create new instance of req for the goroutine.
go func() {
process(req)
sem <- 1
}()
}
}
Run Code Online (Sandbox Code Playgroud)
我碰巧在我自己的项目中几乎复制了这个示例代码(除了我使用的是chan struct{}而不是chan int我的信号量,并将其声明为Servefunc的本地代码).盯着它,我想知道是否从多个并发goroutine访问相同的通道真的很好,或者是否需要类似的东西sem := sem.
是的,从多个 goroutine 使用相同的通道没有问题,这样做很正常。
这样做的原因req := req不是为了 goroutine 的利益,而是为了防止闭包内出现意外行为。如果没有它,循环的每次迭代都会改变闭包内的 req 值,而不是每次都给它一个唯一的值。
可以在这里找到此效果的快速示例:http://play.golang.org/p/ylRQkh2SeC