今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《如何解决写入 CSV 时出现“短写入”错误》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《如何解决写入 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的相关知识,也可关注编程网公众号。
--结束END--
本文标题: 如何解决写入 CSV 时出现“短写入”错误
本文链接: https://lsjlt.com/news/596007.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0