登录
首页 >  Golang >  Go问答

如何解决写入 CSV 时出现“短写入”错误

来源:stackoverflow

时间:2024-03-29 20:09:33 442浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《如何解决写入 CSV 时出现“短写入”错误》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我一直遇到这个问题,我似乎无法弄清楚发生了什么。我有将一些信息附加到 csv 的代码。该信息来自多个线程,csv 记录时间。

在程序执行过程中的某个时刻,代码将开始输出“short write”,而不是写入 csv。

打印要输出的数据,“好”写和“短”写似乎没有区别,一旦“短写”错误停止,它就会继续,直到程序重新启动。

每次需要写入 csv 时都会调用此代码。

output := []string{time.message, strconv.formatint(time.duration, 10)}
        fmt.println(output)
        err := writer.write(output)
        if err != nil {
            fmt.println("an error encountered ::", err)
            fmt.println("writer.write error")
            logmessage(err.error())
        }
        writer.flush()

看看我的输出,这是它开始短写的点。

[message1 21]
[message2 207]
[message3 79]
an error encountered :: short write
writer.write error
short write

这是我在 csv 中的输出

message1,21
message2,207
ssage2,207

所以看起来短写是来自第二行,但为什么它把我的消息写了两次,为什么它是“短写”消息?有数百条成功消息,然后错误似乎突然发生。

查看代码,调用 csv 编写器功能的位置仅命中一次,因此我真的很困惑为什么会发生这种情况。


解决方案


应用程序在 writer 上存在数据争用。使用 sync.Mutex 确保一次只有一个 goroutine 访问 writer。

mu.lock() // <-- lock to prevent concurrent write and flush.
output := []string{time.message, strconv.formatint(time.duration, 10)}
fmt.println(output)
err := writer.write(output)
if err != nil {
  fmt.println("an error encountered ::", err)
  fmt.println("writer.write error")
  logmessage(err.error())
}
writer.flush()
mu.unlock() // <-- unlock.

在应用程序上运行 race detector 并修复任何报告的问题。

我猜您正在使用带缓冲区的编写器(例如 bufio)。当一个 groutine 正在向缓冲区写入数据而另一个正在尝试刷新时,会发生此错误。

只需在关键部分添加一个储物柜即可。

mu.Lock()
// critical section
mu.Unlock()

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>