gpt4 book ai didi

http - 如何在 Go 中禁用 http 警报

转载 作者:IT王子 更新时间:2023-10-29 02:25:39 26 4
gpt4 key购买 nike

我在调用 http.ListenAndServe 时遇到以下错误:

http: Accept error: *ip* accept tcp too many open files; retrying in 10ms

我怎样才能禁用它? ulimit -n 是 1024,我无法更改它。

最佳答案

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

  1. 保持原样:标准库使用 exponential backoff等待再次有文件描述符的时间。这通常是一种很好的做法,可以让 future 的客户有机会获得名额。事实上,http 包会为发生的每个临时 网络错误执行此操作。
  2. 当出现这样的临时错误时关闭连接。这可以通过包装 net.Listen 返回的 net.Listener 并修改它的 Accept() 方法以在出现临时错误时断开连接来实现.
  3. 忽略消息。如果消息是唯一困扰您的事情,您只需将 log.Output() 设置为 ioutil.Discard。 (虽然这是一个选项,但我看不到它的用途。您最终会忽略重要的错误消息并想知道为什么您的服务不起作用。)

我更喜欢第一个,但在某些情况下您可能需要第二个,所以这里是一个连接丢弃监听器 (on play) 的示例:

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)
}

有了这个DroppingListenerAccept 方法将在有连接时立即返回一个连接没有更多的临时错误。

关于http - 如何在 Go 中禁用 http 警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22353350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com