multithreading - 写入CSV时如何解决 “short write”错误

标签 multithreading csv go

我遇到了这个问题,似乎无法弄清楚发生了什么。我有将一些信息附加到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/

相关文章:

c++ - 从两个线程调用 std::deque 上的删除和push_back是否是线程安全的?

Java 2D 游戏 - 定时器与线程?

python - CSV文件解析(python)

python - 在 Python 中从列表写入 .csv 文件

java - 确定同步范围?

ios - NSThread 保留计数

python - 如何在 Python 中将 CSV 列读取为字符串

python - 写入后无法使用 go 从文件中读取字节

go - 扫描dynamodb表并在go sdk列表中使用包含

go - 如何在golang中使用gin包获取postman的header数据