【发布时间】:2018-12-03 00:54:32
【问题描述】:
我写了一个小程序来练习围棋频道。
package main
import (
"log"
"strconv"
)
var MaxOutstanding int = 1
var channelSize int = 10
var sem = make(chan int, MaxOutstanding)
type Request struct {
command string
data string
}
func process(req *Request) {
log.Println(req)
}
func serve(reqs chan *Request) {
for req := range reqs {
sem <- 1
go func() {
process(req)
<-sem
}()
}
}
func main() {
reqs := make(chan *Request, channelSize)
for i := 0; i < channelSize; i++ {
req := &Request{"start", strconv.Itoa(i)}
reqs <- req
}
close(reqs)
serve(reqs)
}
打印出来
2018/12/02 16:52:30 &{start 1}
2018/12/02 16:52:30 &{start 2}
2018/12/02 16:52:30 &{start 3}
2018/12/02 16:52:30 &{start 4}
2018/12/02 16:52:30 &{start 5}
2018/12/02 16:52:30 &{start 6}
2018/12/02 16:52:30 &{start 7}
2018/12/02 16:52:30 &{start 8}
2018/12/02 16:52:30 &{start 9}
因此,&{start 0} 不会被打印。这个怎么不见了?
【问题讨论】:
-
你对
sem的看法很奇怪。如果您希望频道上的读者数量有限,那么只启动那么多读者。每个读者都会阅读reqs。嗯,随便。您的sem与我读过的其他 Go 代码不同。 -
反正我是这样写的,不是你必须这样写:play.golang.org/p/RB3sUoSaSxm
-
@ZanLynx 感谢您的额外建议!
标签: go concurrency channel goroutine