【问题标题】:Go read text with goroutine使用 goroutine 阅读文本
【发布时间】:2014-11-29 02:04:54
【问题描述】:

我想用 goroutines 读取文本文件。从文件中读取的文本顺序无关紧要。如何并发读取文件?

scanner := bufio.NewScanner(file)
for scanner.Scan() {
  lines = append(lines, scanner.Text())
}

例如,如果文本文件包含I like Go,我想读取这个文件而不考虑顺序。可能是[]string{"Go", "like", "I"}

【问题讨论】:

  • 文件 IO 将是最慢的部分。使用 goroutine 不会加快这个过程。
  • 你为什么要这样做?

标签: go goroutine


【解决方案1】:

首先,如果您正在从 io.Reader 读取,请将其视为从流中读取。它是单个输入源,由于它的性质,您不能“并行读取” - 在引擎盖下,您正在获取字节,等待另一个,再获取一个等等。用文字标记它稍后在缓冲区中。

其次,我希望您不要试图以“让我们添加 gouroutines 一切都会加快速度”的方式将 goroutines 用作“灵丹妙药”。如果 Go 为您提供了一种使用并发的简单方法,那并不意味着您应该在任何地方都使用它。

最后,如果您真的需要将大文件并行拆分为单词,并且您认为拆分部分将成为瓶颈(不知道您的情况,但我真的很怀疑)-那么您必须自己发明算法并使用“os”包来查找()/读取()文件的各个部分,每个部分都由它自己的 gouroutine 处理,并以某种方式跟踪哪些部分已被处理。

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多