Go 导致内存溢出的计时器开销

Go 导致内存溢出的计时器开销,go,channel,Go,Channel,从timer.Stop()开始 停止可防止计时器触发。如果调用 停止计时器,如果计时器已过期或已停止,则为false 停止。停止不关闭通道,以防止从 通道错误地成功 我需要找到一种方法,通过或销毁程序中创建的计时器对象或通道。我不是直接使用这些函数,只是使用这些函数实现超时的另一个库。我处理的请求越多,程序的内存就会不断增加,然后被杀死 我调查了以下地方,但没有得到太多帮助: 请帮帮我,我需要拼命解决这个问题 更新 可疑代码位于 var超时0{ timeoutCh=时间之后(c.time

从timer.Stop()开始

停止可防止计时器触发。如果调用 停止计时器,如果计时器已过期或已停止,则为false 停止。停止不关闭通道,以防止从 通道错误地成功

我需要找到一种方法,通过或销毁程序中创建的计时器对象或通道。我不是直接使用这些函数,只是使用这些函数实现超时的另一个库。我处理的请求越多,程序的内存就会不断增加,然后被杀死

我调查了以下地方,但没有得到太多帮助:

  • 请帮帮我,我需要拼命解决这个问题

    更新

    可疑代码位于

    var超时0{
    timeoutCh=时间之后(c.timeout)
    }
    挑选{
    
    案例错误:=我已经为此合并了一个修复程序,如果您遇到进一步的问题,请提出一个问题

    您能提供出现问题的代码吗?那么您是说对这数十万个计时器通道的引用没有超出范围,所以它们不会被垃圾收集?您好,我已经添加了可疑代码和PPRMemprofile输出到问题。该代码没有错误,您不需要明确清理计时器(
    time.After
    只是
    time.NewTimer(d.C
    )的简写。您的超时设置为多长时间,请求速率是多少?@JimB timeout设置为15分钟,请求速率>3K每秒(尽可能快)。我已尝试用time.NewTimer替换
    time.After
    ,并使用Stop()。它更精简,但一段时间后内存仍然不足。
    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
    }