来自timer.Stop()documentation
停止阻止定时器触发。如果调用它返回true 如果计时器已经过期或已经过期,则停止计时器 停止。停止不关闭通道,以防止从中读取 渠道成功不正确。
我需要找到一种方法来通过After或NewTimer销毁在程序中创建的计时器对象或频道。我没有直接使用这些函数,只是使用这些函数实现超时的另一个库。我处理程序内存的请求越来越多,然后被杀死。
我已经调查过以下几个地方,但没有多少帮助:
请帮助,需要拼命解决这个问题。
更新
可疑代码位于https://github.com/gocql/gocql/blob/986e33a705412161497203d55d0669d04282f5ff/conn.go#L546
var timeoutCh <-chan time.Time
if c.timeout > 0 {
timeoutCh = time.After(c.timeout)
}
select {
case err := <-call.resp:
if err != nil {
if !c.Closed() {
// if the connection is closed then we cant release the stream,
// this is because the request is still outstanding and we have
// been handed another error from another stream which caused the
// connection to close.
c.releaseStream(stream)
}
return nil, err
}
case <-timeoutCh:
close(call.timeout)
c.handleTimeout()
return nil, ErrTimeoutNoResponse
case <-c.quit:
return nil, ErrConnectionClosed
}
我怎么知道这个?我跑去工具pprof捕获memprof,它显示的是: