goroutine内存不足UPD:执行错误处理

UPD:事实证明,这是有关Go中错误处理的问题


我编写了一个简单的网络抓取工具,该工具在“主线程”上生成网页的地址,在一个go例程中获取实际的页面,然后通过传回内容chan,然后将其写入另一个文件中。常规。但是,在此过程进行了约300,000次迭代后,出现以下错误:


panic: runtime error: invalid memory address or nil pointer dereference

[signal 0xb code=0x1 addr=0x38 pc=0x22e9]</pre>

错误“ stacktrace”很长,很遗憾,我现在没有它(我将在重复实验后稍后再发布)。


是否需要以某种方式管理内存,关闭通道或类似的东西?


以下是一些遗漏的代码。


package main


import (

    "fmt"

    "io/ioutil"

    "net/http"

    "strconv"

)


func main() {

    channel := make(chan []byte)


    for i:=0; i < 20; i++ {

        go fetcher(generateLink(), channel)

    }


    for a:=0; ; a++ {

        go writeToFile(strconv.Itoa(a), <-channel)

        go fetcher(generateLink(), channel)

        fmt.Println(strconv.Itoa(a))

    }

}


func fetcher(url string, channel chan []byte) {


    resp, err := http.Get(url)

    if err != nil {

        channel <- []byte("")

    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    channel <- body

}


func writeToFile(filename string, bytes []byte) {

    ioutil.WriteFile(filename+".html", bytes, 0644)

}


func generateLink() string {

    ...

}


凤凰求蛊
浏览 225回答 3
3回答

郎朗坤

panic: runtime error: invalid memory address or nil pointer deference这意味着您尝试使用nil指针。这是程序员错误,而不是内存不足错误。由于我无权访问实际的跟踪或代码,因此无法为您提供进一步的帮助。编辑:再看一下您的代码后,我认为我找到了可能的错误来源。resp, err := http.Get(url)if err != nil {&nbsp; &nbsp; channel <- []byte("")}defer resp.Body.Close()您最终resp为了获得字段而进行引用,Body即使是err != nil。如果为err !=nil,则很有可能为零。

慕盖茨4494581

在某些时候,您对的调用http.Get()失败并返回non-nil&nbsp;err。发生这种情况时,您将一个空字节片放入通道中,但是继续进行,无论resp.Body何时resp为nil都尝试从中读取。

慕田峪4524236

我只是在这里猜测,因为我没有stacktrace。但是以下两行对我来说可疑:body,&nbsp;err&nbsp;:=&nbsp;ioutil.ReadAll(resp.Body) channel&nbsp;<-&nbsp;body当您在频道上发送身体时,您怎么知道它不是零?由于writeToFile不会对其进行检查,因此很有可能您正在向该文件写入一个nil字节片,并且该文件正在此处爆炸。如果捕获到错误,则应在继续操作之前进行检查。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go