首页 > 解决方案 > 无法在 Linux (Mint) 上的 goroutine 中运行 go web serve

问题描述

我正在尝试在我的 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))
}

我的 web 文件夹中有一个简单的 HTML 文件,任何有效的 HTML 都可以。

 <h1>THIS IS A TEST</h1>

然后我将浏览器指向http://127.0.0.1:8101/web/index.html

在 Windows 上,无论我使用哪种方法,我都会得到我的页面。

在 Linux 上,如果我不使用 goroutine,我只能访问我的页面。

标签: linuxgo

解决方案


实际上,这取决于 CPU 中可用的内核数。这就是 goroutines 的工作原理。在您的情况下,在 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 操场上的工作代码

GOMAXPROCS 设置可以同时执行的最大 CPU 数量并返回之前的设置。如果 n < 1,则不会更改当前设置。可以使用 NumCPU 查询本地机器上逻辑 CPU 的数量。当调度程序改进时,此调用将消失。

注意:即使你想等待 goroutine 使用,也不要使用永无止境的循环WaitGroups.


推荐阅读