无法在 Linux 上的 goroutine 中运行 go web serve (Mint)



我正试图在我的go应用程序中启动一个web服务器。当我在Windows上运行我的代码时,一切都如预期的那样工作。应用程序运行,启动web服务器,然后等待。在linux上,它似乎做了同样的事情,只是我无法访问网络服务器。

如果我在不使用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的情况下才能访问我的页面。

实际上,这取决于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 %dn", getGOMAXPROCS())
}

围棋游戏场工作规范

GOMAXPROCS设置可以执行的CPU的最大数量同时返回先前的设置。如果n<1,它没有更改当前设置。本地上的逻辑CPU数量机器可以用NumCPU查询。当调度器得到改进。

注意:也不要使用永不结束循环,即使您想等待执行例程,也要使用WaitGroups.

最新更新