为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
凤凰求蛊 2021-05-06 18:45:44
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 mainimport (    "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 {    ...}
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

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

这意味着您尝试使用nil指针。这是程序员错误,而不是内存不足错误。由于我无权访问实际的跟踪或代码,因此无法为您提供进一步的帮助。




编辑:再看一下您的代码后,我认为我找到了可能的错误来源。


resp, err := http.Get(url)

if err != nil {

    channel <- []byte("")

}

defer resp.Body.Close()

您最终resp为了获得字段而进行引用,Body即使是err != nil。如果为err !=nil,则很有可能为零。


查看完整回答
反对 回复 2021-05-17
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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


查看完整回答
反对 回复 2021-05-17
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我只是在这里猜测,因为我没有stacktrace。但是以下两行对我来说可疑:

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

当您在频道上发送身体时,您怎么知道它不是零?由于writeToFile不会对其进行检查,因此很有可能您正在向该文件写入一个nil字节片,并且该文件正在此处爆炸。如果捕获到错误,则应在继续操作之前进行检查。


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信