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 關注
- 142 瀏覽
添加回答
舉報