sync.wait

来源:11-1 实现最简TCP服务器

weixin_慕沐2155417

2022-09-13

wait.go里实现了对等待组的包装,其中有一个超时等待的函数

func (w *Wait) WaitWithTimeout(timeout time.Duration) bool {
	c := make(chan bool, 1)
	go func() {
		defer close(c)
		w.wg.Wait()
		c <- true
	}()
	select {
	case <-c:
		return false // completed normally
	case <-time.After(timeout):
		return true // timed out
	}
}

我的疑问点在于这个channel为什么要设置成带一个缓存的,好像非缓存的channel就能实现

写回答

1回答

Moody

2022-09-13

看起来确实不需要(我这边没有试,目测好像是不需要的)

0
2
qq_四月是你的谎言喽_03448132
还有最好不要用timeAfter ,应该用ctx 的超时,timeAfter 并不会马上结束,并发量大的话会有额外的定时协程,也容易泄露
2023-06-25
共2条回复

深入Go底层原理,重写Redis中间件实战

深入Go语言原理+Go重写Redis

474 学习 · 172 问题

查看课程