我正在阅读O'Reilly的并发性在Go书中,发现了这个代码示例:
doWork := func(
done <-chan interface{},
pulseInterval time.Duration,
) (<-chan interface{}, <-chan time.Time) {
heartbeat := make(chan interface{})
results := make(chan time.Time)
go func() {
defer close(heartbeat)
defer close(results)
pulse := time.Tick(pulseInterval)
workGen := time.Tick(2 * pulseInterval) // this just creates workload
sendPulse := func() {
select {
case heartbeat <- struct{}{}:
default:
}
}
sendResult := func(r time.Time) {
for {
select {
case <-done:
return
case <-pulse:
sendPulse()
case results <- r:
return
}
}
}
for {
select {
case <-done:
return
case <-pulse:
sendPulse()
case r := <-workGen:
sendResult(r)
}
}
}()
return heartbeat, results
}
两个 select 语句用于简单的心跳似乎很奇怪。然后我明白了这背后的原因是 sendResult 不应该阻止尝试将结果发送到通道。如果没有人从该通道接收信号,它将有效地阻止 goroutine 并停止发送检测信号。results
然后我想...为什么他们当时没有这样编码呢?
桃花长相依
墨色风雨
相关分类