2 回答
TA贡献1827条经验 获得超8个赞
因为在serve()你的循环变量中使用了你在一个单独的 goroutine 上执行的函数文字,它被运行循环的 goroutine 同时修改:数据竞争。如果您有数据竞争,则行为是未定义的。
如果您复制变量,它将起作用:
for req := range reqs {
sem <- 1
req2 := req
go func() {
process(req2)
<-sem
}()
}
在Go Playground上尝试一下。
另一种可能性是将其作为参数传递给匿名函数:
for req := range reqs {
sem <- 1
go func(req *Request) {
process(req)
<-sem
}(req)
}
在Go Playground试试这个。
TA贡献1789条经验 获得超8个赞
这是因为当匿名执行时,请求已经从移动Request{0}到Request{1},所以你打印从{start 1}。
// method 1: add a parameter, pass it to anonymous function
func serve(reqs chan *Request) {
for req := range reqs {
sem <- 1
// You should make the req as parameter of this function
// or, when the function execute, the req point to Request{1}
go func(dup *Request) {
process(dup)
<-sem
}(req)
}
// And you should wait for the Request{9} to be processed
time.Sleep(time.Second)
}
// method 2: make for wait anonymous function
func serve(reqs chan *Request) {
for req := range reqs {
go func() {
process(req)
sem <- 1
}()
// Or wait here
<-sem
}
}
- 2 回答
- 0 关注
- 102 浏览
添加回答
举报