我遇到了这个问题,似乎无法弄清楚发生了什么。我有将一些信息附加到CSV的代码。该信息来自多个线程,并且CSV是记录时间。
在程序执行过程中的某个时刻,代码将开始吐出“短写”,而不是写入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访问该写程序。
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并修复所有报告的问题。
关于multithreading - 写入CSV时如何解决 “short write”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66174520/