gpt4 book ai didi

Goroutines 破坏了程序

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:46 26 4
gpt4 key购买 nike

问题是这样的:有一个网络服务器。我认为在页面加载中使用 goroutines 是有益的,所以我继续做了:将 loadPage 函数作为 goroutine 调用。但是,执行此操作时,服务器会简单地停止工作而不会出现错误。它打印一个空白的白色页面。问题必须出在函数本身 - 某种程度上与 goroutine 有冲突。

这些是相关函数:

func loadPage(w http.ResponseWriter, path string) {
s := GetFileContent(path)
w.Header().Add("Content-Type", getHeader(path))
w.Header().Add("Content-Length", GetContentLength(path))
fmt.Fprint(w, s)
}
func GetFileContent(path string) string {
cont, err := ioutil.ReadFile(path)
e(err)
aob := len(cont)
s := string(cont[:aob])
return s
}


func GetFileContent(path string) string {
cont, err := ioutil.ReadFile(path)
e(err)
aob := len(cont)
s := string(cont[:aob])
return s
}

func getHeader(path string) string {
images := []string{".jpg", ".jpeg", ".gif", ".png"}
readable := []string{".htm", ".html", ".php", ".asp", ".js", ".css"}
if ArrayContainsSuffix(images, path) {
return "image/jpeg"
}
if ArrayContainsSuffix(readable, path) {
return "text/html"
}
return "file/downloadable"
}


func ArrayContainsSuffix(arr []string, c string) bool {
length := len(arr)
for i := 0; i < length; i++ {
s := arr[i]
if strings.HasSuffix(c, s) {
return true
}
}
return false
}

最佳答案

发生这种情况的原因是因为您的 HandlerFunc调用“loadPage”的方法与请求同步调用。当您在 go 例程中调用它时,Handler 实际上会立即返回,从而立即发送响应。这就是您得到空白页的原因。

您可以在 server.go 中看到这个(第 1096 行):

serverHandler{c.server}.ServeHTTP(w, w.req)
if c.hijacked() {
return
}
w.finishRequest()

ServeHTTP 函数调用您的处理程序,并在它返回后立即调用“finishRequest”。因此,只要您的处理程序函数想要完成请求,它就必须阻塞。

使用 go 例程实际上不会使您的页面更快。正如 Philip 建议的那样,将单个 go 例程与 channel 同步,在这种情况下也无济于事,因为这与根本没有 go 例程是一样的。

问题的根源实际上是 ioutil.ReadFile,它在发送之前将整个文件缓冲到内存中。

如果你想流式传输你需要使用os.Open的文件。您可以使用 io.Copy 将文件内容流式传输到浏览器,这将使用分块编码。

看起来像这样:

f, err := os.Open(path)
if err != nil {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
n, err := io.Copy(w, f)
if n == 0 && err != nil {
http.Error(w, "Error", http.StatusInternalServerError)
return
}

如果出于某种原因您需要在多个 go 例程中工作,请查看 sync.WaitGroup。 channel 也可以工作。

如果您只想提供一个文件,还有其他为此优化的选项,例如 FileServerServeFile .

关于Goroutines 破坏了程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18024136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com