无法在Linux(Mint)的goroutine中运行Go Web服务

时间:2018-10-31 14:40:59

标签: linux go

我正在尝试在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时才能进入页面。

1 个答案:

答案 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.

,也不要使用永不结束循环