Jakob Østergaard提出了这一挑战:
编写一个程序,从标准输入读取文本,并返回(打印)在文本中找到的不同单词的总数。
我们如何通过并行编程来应对这一挑战(最好用 Go 语言,但用英文描述就足够了)?
Jakob Østergaard提出了这一挑战:
编写一个程序,从标准输入读取文本,并返回(打印)在文本中找到的不同单词的总数。
我们如何通过并行编程来应对这一挑战(最好用 Go 语言,但用英文描述就足够了)?
有几种可能性,但我猜你的意思是“有效地”?
总体思路是将文本拆分为可管理的块,将这些块堆积到一个队列中,并让多个消费者处理这些块。
在我看来,这就像一个典型的 Map/Reduce 应用程序:
_ Worker_
/ \
/ \
Splitter--- Worker ---Aggregator
\ /
\_ Worker _/
理想情况下,“多个”队列将是具有多个消费者的单个队列,因此如果一个工作人员减慢了整个过程的速度,则不会减慢那么多。
我还会使用从 Splitter 到 Workers 的信号,让他们知道输入已被完全消耗,他们可以开始将结果发送到 Aggregator。
这是解决Jakob Østergaard 问题的 Go 语言。
/*
The problem: Write a program that reads text from
standard-input, and returns (prints) the total
number of distinct words found in the text.
C versus C++, Jakob Østergaard, February 24th, 2004
http://unthought.net/c++/c_vs_c++.html
*/
package main
import (
"bufio"
"fmt"
"os"
"unicode"
)
func main() {
rdr := bufio.NewReader(os.Stdin)
words := make(map[string]bool, 1024*1024)
word := make([]int, 0, 256)
for {
r, n, _ := rdr.ReadRune()
if unicode.IsSpace(r) || n == 0 {
if len(word) > 0 {
words[string(word)] = true
word = word[:0]
}
if n == 0 {
break
}
} else {
word = append(word, r)
}
}
fmt.Println(len(words))
}
在这个问题和大多数其他问题中添加“并行编程”这个短语并期待一些神奇的改进是天真的。从流中顺序读取输入并执行琐碎的计算不会为并行计算提供重要机会。