【发布时间】: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