调用时出现以下错误我遇到问题http.ListenAndServe:
http: Accept error: *ip* accept tcp too many open files; retrying in 10ms
Run Code Online (Sandbox Code Playgroud)
我怎么能禁用这个?ulimit -n是1024,我无法改变它.
问题是您无法再打开文件描述符,因此无法接受更多连接.如果你无法改变这个事实,你有三个可能的选择来解决这个问题:
http程序包会针对发生的每个临时网络错误执行此操作.net.Listener返回的by net.Listen并修改它的Accept()方法来删除临时错误的连接来实现.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只要没有临时错误,该方法就会返回连接.
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |