如何在Go中禁用http警报

0 http go

调用时出现以下错误我遇到问题http.ListenAndServe:

http: Accept error: *ip* accept tcp too many open files; retrying in 10ms
Run Code Online (Sandbox Code Playgroud)

我怎么能禁用这个?ulimit -n是1024,我无法改变它.

nem*_*emo 6

问题是您无法再打开文件描述符,因此无法接受更多连接.如果你无法改变这个事实,你有三个可能的选择来解决这个问题:

  1. 保持原样:标准库使用指数退避来等待再次存在文件描述符的时间.这通常是一种很好的做法,让未来的客户有机会获得一个位置.实际上,http程序包会针对发生的每个临时网络错误执行此操作.
  2. 发生此类临时错误时关闭连接.这可以通过包装net.Listener返回的by net.Listen并修改它的Accept()方法来删除临时错误的连接来实现.
  3. 忽略该消息.如果消息是困扰你的唯一事情,你可以简单地设置log.Output()ioutil.Discard.(虽然这是一个选项,但我没有看到它的使用.你最终会忽略重要的错误消息,并想知道为什么你的服务不起作用.)

我更喜欢第一个,但可能有一个你想要第二个的情况,所以这里是一个连接丢弃监听器的例子(正在播放):

type DroppingListener struct {
    net.Listener
}

func (d DroppingListener) Accept() (net.Conn, error) {
    for {
        conn, err := d.Listener.Accept()

        if err != nil {
            if ne, ok := err.(net.Error); ok && ne.Temporary() {
                log.Println("Dropping connection because:", ne)
                continue
            }
        }

        return conn, err
    }
}

func ListenAndServe(addr string, handler http.Handler) error {
    srv := &http.Server{Addr: addr, Handler: handler}

    l, e := net.Listen("tcp", addr)
    if e != nil {
        return e
    }

    l = &DroppingListener{l}

    return srv.Serve(l)
}
Run Code Online (Sandbox Code Playgroud)

这样DroppingListener,Accept只要没有临时错误,该方法就会返回连接.