3 回答

TA貢獻1836條經(jīng)驗 獲得超3個贊
此代碼提供了在多個 goRoutines 之間分配工作(在文檔中查找字符串)的示例?;旧希a是啟動goroutines并向他們提供文檔以通過通道進行搜索。
但為什么不直接使用字符串數(shù)組呢?
可以使用字符串數(shù)組和變量(我們稱之為count)來跟蹤您正在處理的數(shù)組中的項目。你會有一些類似的代碼(有點啰嗦來演示一點):
for {
if count > len(docarray) {
break;
}
doc := docarray[count]
count++
// Process the document
}
但是您會遇到同步問題。例如,如果兩個 go 例程(在不同的處理器內(nèi)核上運行)if count > len(docarray)同時到達會發(fā)生什么?如果沒有什么措施來阻止這種情況,它們可能最終都會處理切片中的相同項目(并且可能會跳過下一個元素,因為它們都運行count++)。
進程同步很復雜,而且問題很難調(diào)試。使用通道可以讓您隱藏很多復雜性,并使您的代碼更有可能按預期工作(它并不能解決所有問題;請注意在atomic.AddInt64(&found, lFound)示例代碼中使用 來防止多個 go 例程導致的另一個潛在問題同時寫入變量)。

TA貢獻1863條經(jīng)驗 獲得超2個贊
作者似乎只是用一個人為的例子來說明渠道是如何工作的。也許他需要想出一個更現(xiàn)實的例子。但他確實說:
注意:編寫并發(fā)版本的 add 時可以采用多種方法和選項。此時不要糾結(jié)于我的特定實現(xiàn)。如果您有一個更具可讀性且性能相同或更好的版本,我很樂意與您分享。
因此,很明顯他并不是想為這項工作編寫最好的代碼,只是為了說明他的觀點。
- 3 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報