2 回答
TA贡献1836条经验 获得超5个赞
该函数始终返回计数 == 1 的结果。countWord
下面是递增计数的函数版本:
func countWord(word string, tempMap map[string]int) Result {
count := tempMap[word] + 1
tempMap[word] = count
return Result{word, count}
}
但要抱住这个想法!该函数假定结果为 1。鉴于问题中的工人总是按预期发送,我们可以通过直接从发送来将工人从图片中剔除。代码如下:computeTotalcountResult{word, 1}computeTotalResult{word, 1}readText
func computeTotal() {
i := 0
for e := range resultC {
total[e.word] += e.count
i += 1
fmt.Println(i)
}
}
func readText() {
file, err := os.Open(FILENAME)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
for scanner.Scan() {
word := strings.ToLower(scanner.Text())
resultC <- Result{strings.Trim(word, ".,:;"), 1}
}
close(resultC)
}
main() {
...
go readText()
computeTotal()
fmt.Println(total)
...
}
通道操作的开销可能否定了运行和单独戈鲁廷的任何好处。下面是组合成单个戈鲁廷的代码:computeTotalreadText
func main() {
file, err := os.Open(FILENAME)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
var total = map[string]int{}
for scanner.Scan() {
word := strings.ToLower(strings.Trim(scanner.Text(), ".,:;"))
total[word]++
}
fmt.Println(total)
}
问题中的函数使我认为您的目标是计算每个工人的单词并合并结果以获得总计。这是代码:countWord
func computeTotal() {
for i := 1; i <= NUMOFWORKER; i++ {
m := <-resultC
for word, count := range m {
total[word] += count
}
}
}
func workerPool() {
for i := 1; i <= NUMOFWORKER; i++ {
go worker()
}
}
func worker() {
var tempMap = make(map[string]int)
for w := range words {
tempMap[w]++
}
resultC <- tempMap
}
...
var resultC = make(chan map[string]int)
...
func main() {
...
go readText()
workerPool()
computeTotal()
...
}
TA贡献1811条经验 获得超5个赞
您必须通过以下方式重写函数:computeTotal
func computeTotal(done chan struct{}) {
defer close(done)
i := 0
for e := range resultC {
total[e.word] += e.count
i += 1
fmt.Println(i)
}
}
func main() {
computeTotalDone := make(chan struct{})
go computeTotal(computeTotalDone)
...
workerPool() //blocking
<-computeTotalDone
fmt.Println(total)
}
添加会导致无效结果的原因是您的实现具有争用条件。由于在主函数和函数中打印总结果并行运行,因此不能保证在调用之前处理所有消息。如果没有该功能,您的计算机上的速度就足以产生正确的结果。fmt.Printlnfmt.Println(total)computeTotalcomputeTotalfmt.Println(total)fmt.PrintlncomputeTotal
建议的解决方案可确保在调用之前完成。computeTotalfmt.Println(total)
- 2 回答
- 0 关注
- 111 浏览
添加回答
举报