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

时间:2015-09-07 10:18:38

标签: http go listener

我正在尝试编写一个http服务器,当收到终止信号时,它会等到所有请求都被响应,然后用以下代码关闭

// 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\n")
    wg.Wait()

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

但是当我致电listener.Close()时,即使所有请求都已响应,它仍停留在wg.Wait()。当它等待时,如果我发送另一个请求,它仍然会正确地给出响应。

0 个答案:

没有答案