我正在编写一个程序,该程序从文本文件中逐字逐字读取,以使用通道和工作线程池模式计算出现次数
该程序在以程中工作:
读取文本文件(函数)readText
readText
函数将每个单词发送到通道word
每个戈鲁丁执行对地图中的单词进行计数的函数countWord
每个戈鲁丁返回一个映射,工作器函数将结构的结果值传递给通道resultC
测试函数根据来自通道的结果值创建映射resultC
打印从步骤 5 创建的地图
该程序有效,但当我尝试放置看到过程如下所示fmt.Println(0)
func computeTotal() {
i := 0
for e := range resultC {
total[e.word] += e.count
i += 1
fmt.Println(i)
}
}
程序终止而不显示/计算所有单词
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 all goroutines finished 16 17 18 map[but:1 cat's:1 crouched:1 fur:1 he:2 imperturbable:1 it:1 pointed:1 sat:1 snow:1 stiffly:1 the:1 was:2 with:1] total words: 27 38 ... 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 Time taken for reading the book 5.8145ms
如果我在此处的计算总计函数语句中取消注释 fmt.println(), 程序将正确显示结果,输出如下所示
all goroutines finished
map[a:83 about:4 above:2 absolute:1 accepted:1 across:1 affection:1 after:1 again:5 wonder:2 wood:5 wooded:1 woody:1 work:1 worked:2 world:4 would:11 wrapped:1 wrong:1 yellow:2 yielded:1 yielding:1 counts continues ......]
total words: 856
Time taken for reading the book 5.9924ms
这是我对阅读文本的实现
//ensure close words at the right timing
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())
words <- strings.Trim(word, ".,:;")
}
//time.Sleep(1 * time.Second)
close(words)
}
这是我使用工人池的计数单词实现
//call countWord func,
func workerPool() {
var wg sync.WaitGroup
for i := 1; i <= NUMOFWORKER; i++ {
wg.Add(1)
go worker(&wg)
}
wg.Wait()
fmt.Println("all goroutines finished")
close(resultC)
}
我一直在寻找为什么程序没有显示一致的结果,但我还无法弄清楚。如何对程序进行更改,使其产生相同的结果?
一只甜甜圈
四季花海
相关分类