2 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
該函數(shù)始終返回計(jì)數(shù) == 1 的結(jié)果。countWord
下面是遞增計(jì)數(shù)的函數(shù)版本:
func countWord(word string, tempMap map[string]int) Result {
count := tempMap[word] + 1
tempMap[word] = count
return Result{word, count}
}
但要抱住這個(gè)想法!該函數(shù)假定結(jié)果為 1。鑒于問(wèn)題中的工人總是按預(yù)期發(fā)送,我們可以通過(guò)直接從發(fā)送來(lái)將工人從圖片中剔除。代碼如下: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)
...
}
通道操作的開銷可能否定了運(yùn)行和單獨(dú)戈魯廷的任何好處。下面是組合成單個(gè)戈魯廷的代碼: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)
}
問(wèn)題中的函數(shù)使我認(rèn)為您的目標(biāo)是計(jì)算每個(gè)工人的單詞并合并結(jié)果以獲得總計(jì)。這是代碼: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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
您必須通過(guò)以下方式重寫函數(shù):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)
}
添加會(huì)導(dǎo)致無(wú)效結(jié)果的原因是您的實(shí)現(xiàn)具有爭(zhēng)用條件。由于在主函數(shù)和函數(shù)中打印總結(jié)果并行運(yùn)行,因此不能保證在調(diào)用之前處理所有消息。如果沒(méi)有該功能,您的計(jì)算機(jī)上的速度就足以產(chǎn)生正確的結(jié)果。fmt.Printlnfmt.Println(total)computeTotalcomputeTotalfmt.Println(total)fmt.PrintlncomputeTotal
建議的解決方案可確保在調(diào)用之前完成。computeTotalfmt.Println(total)
- 2 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)