【问题标题】:Can't run go web serve in goroutine on Linux (Mint)无法在 Linux (Mint) 上的 goroutine 中运行 go web serve
【发布时间】:2018-10-31 14:40:59
【问题描述】:

我正在尝试在我的 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,我只能访问我的页面。

【问题讨论】:

  • 两个操作系统是否安装在同一个系统上?
  • linux机器是虚拟的,运行在windows机器上。
  • 使用 goroutine 在 Linux 上会发生什么? HTTP错误?超时?您的应用程序有任何控制台输出吗?应用程序是继续运行还是退出?
  • 另外请注意,只要应用程序正在运行,您的for {} 就会以 100% 占用一个 CPU 内核。 select {} 更友好,因为它不使用任何资源。
  • 看起来问题出在 for {} 上。我将其更改为选择 {},它现在可以在 Windows 和 Linux 上运行。谢谢!

标签: linux go


【解决方案1】:

实际上,这取决于 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 playground 上的工作代码

GOMAXPROCS 设置可以执行的最大 CPU 数 同时返回之前的设置。如果 n

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

【讨论】:

  • 根据发布的代码,main 在应用程序被杀死之前不会退出。 main 的最后一行是 for {}不可能使用问题中的给定代码“在您的 go 例程完成执行之前退出主程序”。
  • @Adrian 当然,我刚刚阅读了 cmets,并且如果没有结束 for 循环,程序将在某个时间后挂起,或者如果使用的内核数量少于几分钟内挂起的数量。因此,我的回答再次是正确的,这可能是背后的原因。而且您在 cmets 中也提供了相同的理由。
猜你喜欢
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2023-03-04
  • 2014-01-01
  • 2019-11-10
相关资源
最近更新 更多