doumouyi4039 2015-09-07 10:18
浏览 97

当我调用listener.Close()时,http服务器不会停止

I'm trying to write a http server which when received terminate signal, it will wait until all requests has been responsed then close with code below

// start server
var wg sync.WaitGroup
server := &http.Server{
    ConnState: func(conn net.Conn, state http.ConnState) {
        switch state {
        case http.StateNew:
            wg.Add(1)
        case http.StateClosed:
            wg.Done()
        }
    },
}

go func(server *http.Server, listener net.Listener, terminate chan<- int) {
    var status int
    if err := server.Serve(listener); err != nil {
        if !strings.Contains(err.Error(), "use of closed network connection") {
            log.Println(err)
            status = 1
        } else {
            status = 0
        }
    } else {
        status = 0
    }

    log.Printf("performing graceful close on all clients
")
    wg.Wait()

    terminate <- status
}(server, listener, terminate)

but when I call listener.Close() it stuck at wg.Wait() even though all request has already been response. And while it wait, if I send another request, it still give a response correctly.

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 msix packaging tool打包问题
    • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
    • ¥15 python的qt5界面
    • ¥15 无线电能传输系统MATLAB仿真问题
    • ¥50 如何用脚本实现输入法的热键设置
    • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
    • ¥30 深度学习,前后端连接
    • ¥15 孟德尔随机化结果不一致
    • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
    • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线