【问题标题】:BufferedWriter doesn't works when used concurrentlyBufferedWriter 在同时使用时不起作用
【发布时间】:2019-03-16 16:00:23
【问题描述】:

我需要同时从多个 goroutine(比如 30 个)向文本文件写入大量数据。我要做的是:

workers.Add(core.Concurrency)
    for i := 0; i < core.Concurrency; i++ {
        go func() {
            defer workers.Done()
            writer := bufio.NewWriter(f)
            defer writer.Flush()
            a.Worker(workChan, writer)
        }()
    }

但这似乎不适用于某些情况。这里f*os.File 对象。在某些情况下,这根本不会写入文件,在某些情况下,它会写入一些数据,但不会进行未来的写入。行为非常不一致,也没有错误。

任何想法为什么会发生这种情况?

【问题讨论】:

  • @Flimzy 这很有道理,我认为它与并发有关。我发现了这个 - github.com/free/concurrent-writer。试试看
  • 因为 bufio.Writer 在缓冲区满时刷新,所以数据以不可预知的顺序写入f。有办法解决这个问题。提供有关应用程序正在写入的内容的一些详细信息(应用程序是否在写入某种分隔记录,记录有多大......)
  • @Flimzy 我有多个编写器,因为需要解析的数据相当大,实际上是大量的 dns 名称,这些名称是从在线资源中抓取的,所以我想要多个编写器按顺序排列获得速度。我想单身​​作家也不错。
  • @ThunderCat 应用程序正在将主机名换行符写入文件中,是的,该文件未受保护。我认为文件上的全局互斥体就足够了。
  • @Flimzy 这实际上是有道理的,我会选择一个作家。感谢您的帮助。

标签: go concurrency writer buffered


【解决方案1】:

问题是你有多个 goroutine 试图一次写入一个文件,没有任何同步。这将导致不可预测的输出顺序,并可能丢失写入。在此之上使用缓冲 I/O 只会有助于掩盖行为。

最好的解决方案是启动一个写入输出的 goroutine(有或没有缓冲 I/O,取决于您的需要),并让所有工作人员将要写入的数据发送到写入 goroutine一个频道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多