如何在Go中禁用http警报
调用http.ListenAndServe时,我遇到以下错误问题:如何在Go中禁用http警报,http,go,Http,Go,调用http.ListenAndServe时,我遇到以下错误问题: http: Accept error: *ip* accept tcp too many open files; retrying in 10ms 如何禁用此功能ulimit-n是1024,我无法更改它。的客户端少于1000个 你希望这里发生什么?您似乎无法满足资源需求。问题是您无法再打开文件描述符,因此无法接受更多连接。如果您无法改变事实,您有三种可能的选择来处理此问题: 保持原样:标准库使用一个函数来等待再次出现文件描述符
http: Accept error: *ip* accept tcp too many open files; retrying in 10ms
如何禁用此功能
ulimit-n
是1024,我无法更改它。的客户端少于1000个
你希望这里发生什么?您似乎无法满足资源需求。问题是您无法再打开文件描述符,因此无法接受更多连接。如果您无法改变事实,您有三种可能的选择来处理此问题:
http
包对发生的每个临时网络错误都执行此操作net.Listen
返回的net.Listener
并修改其Accept()
方法来实现,以便在出现临时错误时断开连接log.Output()
设置为ioutil.Discard
。(虽然这是一个选项,但我看不出有什么用处。你最终会忽略重要的错误消息,并想知道为什么你的服务不起作用。)DroppingListener
,Accept
方法将在有连接时立即返回连接
不再出现临时错误。请单击如何禁用allerts mess。用户将选择#3。将普遍应用这一变化。任何事情都不会起作用,用户也不知道为什么。当然,这不是你的错。你的答案都是正确的,但我担心导致这个问题的思维有问题。虽然我和你一样担心,但隐藏信息不会有帮助。我只能警告你不要这样做。我编辑了答案3,更具体地说,这不是一个好主意。
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)
}