0

我需要同时将大量数据从多个 goroutines(比如 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对象。在某些情况下,这根本不会写入文件,在某些情况下,它会写入一些数据,但不会进行未来的写入。行为非常不一致,也没有错误。

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

4

1 回答 1

3

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

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

于 2019-03-16T16:16:27.883 回答