我正在尝试在go应用程序中启动Web服务器。在Windows上运行代码时,一切正常。该应用程序运行后将启动Web服务器,然后等待。在Linux上,除了我无法访问Web服务器外,它似乎执行了相同的操作。
如果我在不使用goroutine的情况下启动Web服务器,则服务器可以工作,只有当我使用goroutine时,它才会失败。
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
// go startWebServer() // This only works on Windows.
// startWebServer() // This works on both Windows and Linux.
fmt.Println("Started web server...")
for {}
}
func startWebServer() {
fileServer := http.FileServer(http.Dir("./web"))
http.Handle("/web/", http.StripPrefix("/web/", fileServer))
log.Fatal(http.ListenAndServe(":8101", nil))
}
我的网络文件夹中有一个简单的HTML文件,任何有效的HTML都可以。
<h1>THIS IS A TEST</h1>
然后,我将浏览器指向http://127.0.0.1:8101/web/index.html
在Windows上,无论使用哪种方法,我都会得到我的页面。
在Linux上,仅当我不使用goroutine时才能进入页面。
答案 0 :(得分:-1)
实际上,这取决于CPU中可用的内核数。例程就是这样工作的。如果您在Windows上运行相同的程序,则可以为go例程提供所有可用的内核。
但是,当您在虚拟linux操作系统上运行程序时。这样可以减少资源数量。
要检查您的程序正在使用多少个内核,请分别在Linux和Windows上使用GOMAXPROCS。
package main
import (
"runtime"
"fmt"
)
func getGOMAXPROCS() int {
return runtime.GOMAXPROCS(0)
}
func main() {
fmt.Printf("GOMAXPROCS is %d\n", getGOMAXPROCS())
}
Go playground上的工作代码
GOMAXPROCS设置可以执行的最大CPU数量 同时并返回上一个设置。如果n <1,则不 更改当前设置。本地逻辑CPU的数量 可以使用NumCPU查询计算机。当 调度程序得到改善。
注意:即使您要等待go常规使用WaitGroups.