gpt4 book ai didi

go - 聆听并服务 : Does it allow several connections at the same time?

转载 作者:数据小太阳 更新时间:2023-10-29 03:41:02 25 4
gpt4 key购买 nike

我使用 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...
  • 只有一个正在处理,第二个没有被调用。一旦第一个返回(15 秒后),第二个开始。
  • 为什么?我希望它们并行处理...
  • 这是交易破坏者,这意味着客户无法同时访问同一页面。

如何回复客户并稍后处理?在处理程序中添加一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com