目前,我的网络应用只是路由器和处理程序。
为了让这部作品值得,我缺少哪些重要的东西?
我认为我必须设置过程的数量以确保它使用最大的goroutines?
我应该使用输出缓冲吗?
你认为缺少哪一种最佳做法?
var (
templates = template.Must(template.ParseFiles("templates/home.html")
)
func main() {
r := mux.NewRouter()
r.HandleFunc("/", WelcomeHandler)
http.ListenAndServe(":9000", r)
}
func WelcomeHandler(w http.ResponseWriter, r *http.Request) {
homePage, err := api.LoadHomePage()
if err != nil {
}
tmpl := "home"
renderTemplate(w, tmpl, homePage)
}
func renderTemplate(w http.ResponseWriter, tmpl string, hp *HomePage) {
err := templates.ExecuteTemplate(w, tmpl+".html", hp)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
答案 0 :(得分:1)
您不需要设置/更改runtime.GOMAXPROCS()
,因为自Go 1.5以来它默认为可用的CPU核心数。
缓冲输出?从性能的角度来看,您并不需要。但您可能还有其他考虑因素。
例如,您的renderTemplate()
功能可能会出现恐慌。如果执行模板开始写入输出,则涉及在写入数据之前设置HTTP响应代码和其他标头。如果之后发生模板执行错误,它将返回错误,因此您的代码会尝试发回错误响应。此时已经编写了HTTP标头,此http.Error()
函数将尝试再次设置标头=>恐慌。
避免这种情况的一种方法是首先将模板渲染到缓冲区(例如bytes.Buffer
),如果模板执行没有返回错误,则可以将缓冲区的内容写入响应编写器。如果发生错误,那么您当然不会写入缓冲区的内容,但会像您一样发回错误响应。
总而言之,您的代码在性能方面是生产就绪的(不包括处理模板执行错误的方式)。
答案 1 :(得分:0)
WelcomeHandler
应在err != nil
为真时返回。templates = template.Must(template.ParseFiles("templates/home.html")
放入init
。将其拆分为单独的行。如果template.ParseFiles
返回错误,则生成Fatal
日志。如果你有多个模板要初始化,那么在goroutines中用一个共同的WaitGroup
初始化它们,以加快启动速度。http.StatusInternalServerError
回复的决定。GOMAXPROCS
> 1如果你有更多的核心肯定是一个好主意,但我会保持它少于可用的核心数。