【问题标题】:Slice bounds out of range切片边界超出范围
【发布时间】:2020-06-14 06:14:30
【问题描述】:

以下代码抛出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】:

从 NextMessage 返回的 mbox 阅读器和消息阅读器对于并发访问是不安全的。由于 mbox 实现中的数据争用,程序出现混乱。

在启动 goroutine 之前通过 slurping 消息数据来修复:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多