【发布时间】: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 上运行。谢谢!