- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用来自 Gorilla Web Toolkit 的 Mux 库以及捆绑的 Go http 服务器。
问题是,在我的应用程序中,HTTP 服务器只是一个组件,需要我自行决定停止和启动。
当我调用 http.ListenAndServe(fmt.Sprintf(":%d", service.Port()), service.router)
时,它会阻塞,我似乎无法阻止服务器运行.
我知道这在过去一直是个问题,现在仍然如此吗?有没有新的解决方案?
最佳答案
关于优雅关闭(在 Go 1.8 中引入),一个更具体的例子:
package main
import (
"context"
"io"
"log"
"net/http"
"sync"
"time"
)
func startHttpServer(wg *sync.WaitGroup) *http.Server {
srv := &http.Server{Addr: ":8080"}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello world\n")
})
go func() {
defer wg.Done() // let main know we are done cleaning up
// always returns error. ErrServerClosed on graceful close
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
// unexpected error. port in use?
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// returning reference so caller can call Shutdown()
return srv
}
func main() {
log.Printf("main: starting HTTP server")
httpServerExitDone := &sync.WaitGroup{}
httpServerExitDone.Add(1)
srv := startHttpServer(httpServerExitDone)
log.Printf("main: serving for 10 seconds")
time.Sleep(10 * time.Second)
log.Printf("main: stopping HTTP server")
// now close the server gracefully ("shutdown")
// timeout could be given with a proper context
// (in real world you shouldn't use TODO()).
if err := srv.Shutdown(context.TODO()); err != nil {
panic(err) // failure/timeout shutting down the server gracefully
}
// wait for goroutine started in startHttpServer() to stop
httpServerExitDone.Wait()
log.Printf("main: done. exiting")
}
关于go - 如何停止 http.ListenAndServe(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39320025/
我已经成功地利用了 http.ListenAndServe(":80", mux) 在 Go 中托管我的 Web 服务。然而,它似乎只适用于本地主机。 http.ListenAndServe("192
我想在 http 包的 ListenAndServe 方法中使用多个处理程序。例如: if err := http.ListenAndServe(":"+s.config.Port, hand
我试图在一个更大的程序中找出一个问题,并编写了这个小测试程序来帮助解决它。 如果我启动一个 http 服务器,然后立即尝试将其关闭,它不会关闭并继续为请求提供服务。我可以对这种行为进行推理,但无法找到
我看到很多代码都在做这种事情: log.Fatal(http.ListenAndServe(":8080",nil)) 我从未见过 http 服务器返回错误,但我想更多地了解我可能会遇到哪些类型的故障
我不是很熟悉 Go 的例程,但由于我正在使用 net/http 的路由器,我看到几次 ListenAndServe() 被包裹通过围棋例程。 服务器需要能够开箱即用地同时处理多个请求以提高效率。那么为
我想知道在使用 ListenAndServe 时是否有办法记录响应。 据我所知,处理程序无权访问“响应”对象。只是一个 ResponseWriter,所以我不能调用 httputil.DumpResp
我正在使用来自 Gorilla Web Toolkit 的 Mux 库以及捆绑的 Go http 服务器。 问题是,在我的应用程序中,HTTP 服务器只是一个组件,需要我自行决定停止和启动。 当我调用
我正在尝试编写一个简单的 Web 应用程序来监听 UDP 数据包。 但我要么只能监听 UDP 数据包,要么运行网络应用程序...... 我不熟悉 GoLang,但这是我用来... 监听 UDP: S
我正在构建一个 API,每秒会收到来自几个来源的许多请求(称为 1000/秒),并且会用非常少的信息(想想 < 1k)快速响应每个请求。 当我使用 HTTP (http.ListenAndServe(
这个问题在这里已经有了答案: How can I return an encoded string in an http response body? (2 个答案) 关闭 3 年前。 在一个非常基
我想编写简单的 REST API 应用程序。我编写了处理 HTTP 请求的代码: package main import ( "fmt" "log" "movies/dao"
我写了一个简单的网络服务器来监听端口 8080。但我不想使用硬编码的端口号。我想要的是我的服务器监听任何可用端口。我想知道我的 Web 服务器正在监听的端口号。 我的代码如下: package mai
我正在为我的服务器开发一个分支。这个想法是在两个不同的文件夹中使用同一个 git 分支的两个克隆,它们或多或少是相同的。第一个文件夹是实时的,第二个是我的开发者。 目前,我正在启动 live-bran
有什么区别 ln, err := net.Listen("tcp", addr) if err != nil { return err } go srv.Serve(ln) 和 ln, err
我是一名新手 Go 程序员。 我正在编写一个 Web 应用程序,我需要服务器在关闭之前等到发出事件请求。 我写了一个等待 5 秒回答的处理程序。如果我发出请求并停止服务器(在 5 秒之前),我会收到“
这个问题在这里已经有了答案: How to restrict web server written in golang to allow a particular address instead o
我开始使用 Go http/net 编程,使用 ListenAndServe 时我没有得到呈现的模板,因为当我运行 main.go 文件时,它会打印 Listening 行并在 Eclipse 上以状
我正在尝试使用 Sublime Text + GoSublime 进行 Golang 开发。 我正在使用 Go 中的网络服务器 (ListenAndServe("8000", &handler))。
假设我像这样启动一个服务器: srv := http.Server{ Addr: ":0", Handler: http.FileServer(http.Dir(".")), }
当我在测试函数中调用 http.ListenAndServe() 时,即使在测试完成并且进程终止后,端口也不会关闭。因此,下次我运行测试时,我会收到错误消息“ListenAndServe: liste
我是一名优秀的程序员,十分优秀!