stanzhai / stanzhai.github.com

我的个人博客,记录点点滴滴~
http://blog.zhaishidan.cn
0 stars 0 forks source link

go为channel设置超时的正确姿势 #5

Open stanzhai opened 5 years ago

stanzhai commented 5 years ago

https://stanzhai.site/blog/post/5c2c881058f8e906e2000040

好记性不如烂键盘

stanzhai commented 5 years ago

@athurg 为什么不直接用:

func timeoutFunc() {
    select {
    case <-ch:
        isRequestEnd <- true // 防止timer长时间堆积消耗内存
    case <-time.After(1e9):
    }
}

如果绝大数的ch没有超时呢?

ayanmw commented 5 years ago

不要用 time.After , 要用 timer := time.NewTimer() 如果没有超时,则要 defer timer.Stop() 就可以了~

绝对没必要额外开一个 go 来做超时的。 另外 可以试试 NoneBlock Channel 方案 , 非阻塞chan的使用