作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我使用 gorilla/mux
制作了一个小型网络服务器。
我在他们的 Github 页面中使用了 README 文件末尾的小示例。
r := mux.NewRouter()
r.HandleFunc("/", listUrlsHandler)
r.HandleFunc("/foo", fooHandler)
http.Handle("/", r)
err := http.ListenAndServe(":9090", nil) // set listen port
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
为了模拟长时间的处理,我在回调函数中添加了一个计时器。
func fooHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "foo is downloading...")
log.Println("foo is downloading...")
time.Sleep(15*time.Second)
}
我同时运行 2x /foo
:
2018/01/12 09:15:03 foo is downloading...
2018/01/12 09:15:18 foo is downloading...
如何回复客户并稍后处理?在处理程序中添加一个 goroutine?
func fooHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "foo is downloading...")
log.Println("foo is downloading...")
go time.Sleep(15*time.Second) // HERE <------------
// go myCustomFunc() // HERE <------------
}
我知道它是如何工作的,但显然我完全错了。我认为路由器在每次调用时都会创建一个 goroutine
。
你能告诉我做我想做的事情的最佳实践是什么吗?
我使用 tcp dump 发现了问题:
第二个请求打开一个 TCP 连接,该连接在 150 毫秒后关闭(来自客户端的 FIN)。然后在第一个请求完成后,第二个请求由第一个请求打开的第一个TCP连接处理。
可能是 Firefox 关闭 TCP 连接并使用之前的连接的行为。
最佳答案
如果您向处理程序添加日志调用,您可以看到何时处理响应:
func downloadFileHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "%s is downloading...\n", vars["namefile"])
log.Printf("%s is downloading...\n", vars["namefile"])
time.Sleep(15*time.Second)
}
例如:
2018/01/12 10:52:42 foo is downloading...
2018/01/12 10:52:44 bar is downloading...
由于 Gorilla Mux 使用 Go 的底层 go 例程,这两个调用正在同步处理,但 15 秒的 time.Sleep
使您无法看到结果。
关于go - 聆听并服务 : Does it allow several connections at the same time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217543/
我是一名优秀的程序员,十分优秀!