Fixes #198
This commit is contained in:
chai2010
2016-01-18 11:22:04 +08:00
parent 884ada9cd0
commit 9666211cd7
71 changed files with 107 additions and 105 deletions

View File

@@ -176,9 +176,9 @@ func makeThumbnails6(filenames <-chan string) int64 {
}
```
註意Add和Done方法的不對策。Add是爲計數器加一在worker goroutine開始之前調用而不是在goroutine中否則的話我們沒辦法確定Add是在"closer" goroutine調用Wait之前被調用。併且Add還有一個參數但Done卻沒有任何參數其實它和Add(-1)是等價的。我們使用defer來確保計數器卽使是在出錯的情況下依然能夠正確地被減掉。上面的程序代碼結構是當我們使用併發循環但又不知道迭代次數時很通常而且很地道的寫法。
註意Add和Done方法的不對策。Add是爲計數器加一在worker goroutine開始之前調用而不是在goroutine中否則的話我們沒辦法確定Add是在"closer" goroutine調用Wait之前被調用。併且Add還有一個參數但Done卻沒有任何參數其實它和Add(-1)是等價的。我們使用defer來確保計數器卽使是在出錯的情況下依然能夠正確地被減掉。上面的程序代碼結構是當我們使用併發循環但又不知道迭代次數時很通常而且很地道的寫法。
sizes channel攜帶了每一個文件的大小到main goroutine在main goroutine中使用了range loop來計算總和。觀察一下我們是怎樣創建一個closer goroutine併讓其等待worker們在關閉掉sizes channel之前退出的。兩步操作wait和close是基於sizes的循環的併發。考慮一下另一種方案如果等待操作被放在了main goroutine中在循環之前這樣的話就永遠都不會結束了如果在循環之後那麽又變成了不可達的部分因爲沒有任何東西去關閉這個channel這個循環就永遠都不會終止。
sizes channel攜帶了每一個文件的大小到main goroutine在main goroutine中使用了range loop來計算總和。觀察一下我們是怎樣創建一個closer goroutine併讓其等待worker們在關閉掉sizes channel之前退出的。兩步操作wait和close是基於sizes的循環的併發。考慮一下另一種方案如果等待操作被放在了main goroutine中在循環之前這樣的話就永遠都不會結束了如果在循環之後那麽又變成了不可達的部分因爲沒有任何東西去關閉這個channel這個循環就永遠都不會終止。
圖8.5 表明了makethumbnails6函數中事件的序列。縱列表示goroutine。窄線段代表sleep粗線段代表活動。斜線箭頭代表用來同步兩個goroutine的事件。時間向下流動。註意main goroutine是如何大部分的時間被喚醒執行其range循環等待worker發送值或者closer來關閉channel的。