gpt4 book ai didi

concurrency - Go 例程可以共享 channel 的所有权吗?

转载 作者:IT王子 更新时间:2023-10-29 01:49:22 26 4
gpt4 key购买 nike

我明白,通常情况下,如果我想从 Go 例程访问一个超出范围的变量,我有责任创建一个副本,在概念上由 Go 例程拥有。 channel 也是如此吗?还是那些豁免?

Effective Go #channels用“编写 req := req 似乎很奇怪,但在 Go 中这样做是 [sic] 合法和惯用的”,指的是此代码示例:

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
}()
}
}

我碰巧在我自己的项目中几乎复制了这个示例代码(除了我使用的是 chan struct{} 而不是 chan int 我的信号量,并将其声明为 Serve 函数的本地)。盯着它看,我想知道从多个并发 goroutine 访问同一个 channel 是否真的很好,或者是否需要像 sem := sem 这样的东西。

最佳答案

是的,从多个 goroutines 使用同一个 channel 没有问题,这样做很正常。

req := req 的原因不是为了 goroutine 的利益,而是为了防止闭包内的意外行为。没有它,循环的每次迭代都会在闭包内更改 req 的值,而不是每次都给它一个唯一的值。

可在此处找到此效果的简单示例:http://play.golang.org/p/ylRQkh2SeC

关于concurrency - Go 例程可以共享 channel 的所有权吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23572990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com