linux - 无法在 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,我只能访问我的页面。
解决方案
实际上,这取决于 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.
推荐阅读
- javascript - 页面加载时自动单击下一个按钮
- php - 如何将图像包含在画廊中 - 包含在文章中
- c# - 为什么 FileSystemWatcher 在监视 Windows 卷的 Linux 容器中不起作用
- java - 在访问其他活动之前,活动不会呈现数组列表
- javascript - 无法发布对象列表,也只允许有限数量的响应标头
- ios - 有没有办法以编程方式检查(或以其他方式)“作为短信发送”选项是否启用?
- javascript - 在应用程序 vue 中检测未定义/空对象属性
- java - 我如何能够基于字符串的对象键实现面向对象的二叉搜索树
- python - http://127.0.0.1:5000/ Flask 服务器显示相同的内容,即使我使用更改源代码
- swift - 如何创建动画 GIF