使用并行计算统计文本中字母的频率。
并行是指把那些同样可以顺序完成的事情并行地做。一个常见的例子就是统计字母的频率。利用并行计算来算出文本数组中每个字母的总频率。
Go 通过“goroutines”来支持并发,用go关键字就能启动一个 goroutine。这种方式简单、轻量又优雅,是这门语言最强大的优势之一。
你可能会发现,这个练习叫_并行_字母频率,但在 Go 里却很少见到“Parallel”这个词。Gopher 们更愿意用Concurrent来描述对多个相互独立的 goroutine 的管理(在其他语言的语境里,这些就是“进程”或“线程”)。这两个说法经常被混用,但 Gopher 们喜欢在技术上保持准确,在讨论 goroutine 那种看似同时执行的情形时,会说“concurrent”。
我们可以让自己的程序按并行来设计,有时它们看起来也像是在并行运行,但只要不能确切掌握代码的执行上下文,我们能保证的就只是这些进程会并发执行。换句话说,它们可能以我们分辨不出的速度顺序执行,但并不是严格意义上的同时进行。
想了解更多,可以看看 Go 官方博客的这篇文章:Concurrency is not parallelism。
如果你刚接触 Go 的并发特性,下面这些资源可以帮你上手。建议在开始这个练习之前先看一看:
如果想深入钻研,可以读一读 @kat-co 写的 Concurrency in Go 这本书。
对这个练习来说,单元测试没法判断你写的并发解法好不好。更好的做法是在本地完成这个练习,再用go test -bench .运行基准测试。好的解法,其并发版本每次操作的纳秒数(ns/op)应该比顺序版本更低。