我知道有一个叫做SetReadDeadline
的函数可以在socket(conn.net)读取时设置超时时间,而io.Read没有该功能。有一种方法是开启另一个例程作为计时器来解决这个问题,但它会带来另一个问题,即读取例程(io.Read)仍然会阻塞:
func (self *TimeoutReader) Read(buf []byte) (n int, err error) {
ch := make(chan bool)
n = 0
err = nil
go func() { // this goroutime still exist even when timeout
n, err = self.reader.Read(buf)
ch <- true
}()
select {
case <-ch:
return
case <-time.After(self.timeout):
return 0, errors.New("Timeout")
}
return
}
这个问题类似于这篇帖子,但是答案不清楚。你们有没有好的想法来解决这个问题?
context
这个方法吗?https://gist.github.com/dchapes/6c992bf3e943934462509338cd213e99 - Eugene Lisitsky