gpt4 book ai didi

concurrency - Goroutines with ListenAndServe 提高性能?

转载 作者:IT王子 更新时间:2023-10-29 01:07:35 25 4
gpt4 key购买 nike

我不是很熟悉 Go 的例程,但由于我正在使用 net/http 的路由器,我看到几次 ListenAndServe() 被包裹通过围棋例程。

服务器需要能够开箱即用地同时处理多个请求以提高效率。那么为什么使用 go 例程作为“轻量级线程”呢?并发性有什么优势吗?

这是 OpenShift 的一个例子

package main

import (
"fmt"
"net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello OpenShift!")
}

func main() {
http.HandleFunc("/", helloHandler)

go func() {
fmt.Println("serving on 8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}()

go func() {
fmt.Println("serving on 8888")
err := http.ListenAndServe(":8888", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}()
select {}
}

最佳答案

http.ListenAndServe 是一个阻塞调用。如果你想做更多的工作(比如进行第二次 http.ListenAndServe 调用),你需要将它移到一个单独的 goroutine 中。这就是他们在这里所做的一切。

他们在最后使用 select{} 来阻止主 goroutine,因为他们对 http.ListenAndServe 的所有调用都在其他 goroutine 上。如果他们不调用 select{},程序将终止,因为 main() 将返回。

他们可以通过删除 select{} 并删除最后一个代码块周围的 go func() 包装器来实现相同的目的。但我怀疑他们这样做是为了让所有代码保持一致。

但这与性能无关。

在评论中,您提供了一些其他类似的示例。在first example :

func main() {
http.HandleFunc("/", responsehandler.Handler)
go func() {
http.ListenAndServe(":8888", nil)
}()
fileservice.NewWatcher()
}

这会调用 http.ListenAndServe,然后调用 fileservice.NewWatcher()(阻塞)。如果他们没有将调用包装在 goroutine 中,则永远不会调用 fileservice.NewWatcher()

其他two examples是一个常见的样板文件:

func init() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
}

这将打开调试探查器 Web 服务器。同样,它是一个 goroutine,因此调用 init 会立即返回而不是阻塞。这种特殊情况允许调用者仅import _ "profiling" 并"神奇地"获取调试分析器 web 服务器。

关于concurrency - Goroutines with ListenAndServe 提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30487703/

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