goroutines-切片边界超出范围

问题描述 投票:0回答:1

以下代码抛出slice bounds out of range错误。

func main()  {

    file, err := os.Open("mails.mbox")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    m := mbox.NewReader(file) // bufio.NewScanner(file)

    for {
        data, err := m.NextMessage() // .Scan()
        if err == io.EOF {
            break
        } else if err != nil {
            log.Fatalf("Unexpected error after NextMessage(): %v", err)
        }
        go saveMessage(data)
    }

    // By now we should not have any messages inside.
    if _, err := m.NextMessage(); err != io.EOF {
        log.Fatalf("We still have data: %v", err)
    }
}

func saveMessage(data io.Reader) {
    msg, err := mail.ReadMessage(data)
    if err != nil {
        return
    }
    // insert msg into database
}

我想同时处理saveMessage功能。

一次100或基于可用内存。

有人可以帮我吗?

谢谢

go concurrency goroutine
1个回答
0
投票
从NextMessage返回的mbox阅读器和消息阅读器对于并发访问并不安全。通过在启动goroutine之前先对消息数据进行研磨来解决:

for { data, err := m.NextMessage() // .Scan() if err == io.EOF { break } else if err != nil { log.Fatalf("Unexpected error after NextMessage(): %v", err) } msg, err := mail.ReadMessage(data) if err != nil { log.Fatal(err) } go saveMessage(msg) } ... func saveMessage(msg *mail.Message) { // insert msg into database }

© www.soinside.com 2019 - 2024. All rights reserved.