请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义,同时过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至出现不可用事故,一般一个请求是由多个串行或并行的子任务来完成的,每个子任务可能是另外的内部请求,那么当这个请求超时的时候,我们就需要快速返回,释放占用的资源,比如goroutine,文件描述符等。
我们可以利用管道了来决这个问题。
package main
import (
"fmt"
"sync"
"time"
)
package main
import (
"fmt"
"time"
)
func job(ch chan<- struct{}) {
time.Sleep(time.Second * 5)
ch <- struct{}{}
}
var ch chan struct{}
func main() {
ch = make(chan struct{}, 1)
go func() {
job(ch)
}()
select {
case <-ch:
fmt.Println("done")
case <-time.After(time.Second * 3):
fmt.Println("timeout process exit!")
}
}