2 回答
TA贡献1860条经验 获得超8个赞
另一个简单而相似的模式。
func hBeatTicker(ctx context.Context, ch chan<- struct{}, t time.Duration) {
tick := time.NewTicker(t)
for {
select {
case <-ctx.Done():
close(ch)
tick.Stop()
return
case <-tick.C:
ch <- struct{}{}
}
}
}
func workGen(ctx context.Context, ch chan<- time.Time, t time.Duration) {
tick := time.NewTicker(2 * t)
for {
select {
case <-ctx.Done():
close(ch)
tick.Stop()
return
case ch <- <-tick.C:
}
}
}
func do(ctx context.Context, d time.Duration) (<-chan struct{}, <-chan time.Time) {
heartbeat, results := make(chan struct{}), make(chan time.Time)
go workGen(ctx, results, d)
go hBeatTicker(ctx, heartbeat, d)
return heartbeat, results
}
TA贡献1853条经验 获得超6个赞
在选择中使用临时变量。根据当前状态将这些变量设置为或原始值。workgenresultsnil
将变量设置为 nil 将禁用选择的分支,因为 nil 通道上的通道操作会永久阻塞。
workGenT := workGen
var resultsT chan time.Time
var result time.Time
for {
select {
case <-done:
return
case <-pulse:
sendPulse()
case result = <-workgenT:
workgenT = nil
resultsT = results
case resultsT <- result:
resultsT = nil
workgenT = workgen
}
}
因为只有一个 和 是非 nil,所以上面的代码有两种状态:程序正在等待接收结果或等待发送结果。workgenTresultsT
- 2 回答
- 0 关注
- 84 浏览
添加回答
举报