ch3,ch3-01 review

This commit is contained in:
chai2010
2015-12-27 15:13:12 +08:00
parent 7c96bf43e6
commit 6978661750
21 changed files with 67 additions and 63 deletions

View File

@@ -144,7 +144,7 @@ $ ./netcat1
$ killall clock2
```
練習8.1: 脩改clock2來支持傳入參數作爲端口號然後寫一個clockwall的程序這個程序可以同時與多個clock服務器通信從多服務器中讀取時間併且在一個表格中一次顯示所有服務傳迴的結果類似於你在某些辦公室里看到的時鐘牆。如果你有地理學上分布式的服務器可以用的話讓這些服務器跑在不同的機器上面或者在同一機器上跑多個不同的實例,這些實例監聽不同的端口,假裝自己在不同的時區。像下面這樣:
練習8.1: 脩改clock2來支持傳入參數作爲端口號然後寫一個clockwall的程序這個程序可以同時與多個clock服務器通信從多服務器中讀取時間併且在一個表格中一次顯示所有服務傳迴的結果類似於你在某些辦公室里看到的時鐘牆。如果你有地理學上分布式的服務器可以用的話讓這些服務器跑在不同的機器上面或者在同一機器上跑多個不同的實例,這些實例監聽不同的端口,假裝自己在不同的時區。像下面這樣:
```
$ TZ=US/Eastern ./clock2 -port 8010 &

View File

@@ -30,7 +30,7 @@ func dirents(dir string) []os.FileInfo {
ioutil.ReadDir函數會返迴一個os.FileInfo類型的sliceos.FileInfo類型也是os.Stat這個函數的返迴值。對每一個子目録而言walkDir會遞歸地調用其自身併且會對每一個文件也遞歸調用。walkDir函數會向fileSizes這個channel發送一條消息。這條消息包含了文件的字節大小。
下面的主函數用了兩個goroutine。後的goroutine調用walkDir來遍歷命令行給出的每一個路徑併最終關閉fileSizes這個channel。主goroutine會對其從channel中接收到的文件大小進行纍加併輸出其和。
下面的主函數用了兩個goroutine。後的goroutine調用walkDir來遍歷命令行給出的每一個路徑併最終關閉fileSizes這個channel。主goroutine會對其從channel中接收到的文件大小進行纍加併輸出其和。
```go
@@ -84,7 +84,7 @@ $ ./du1 $HOME /usr /bin /etc
如果在運行的時候能夠讓我們知道處理進度的話想必更好。但是如果簡單地把printDiskUsage函數調用移動到循環里會導致其打印出成百上韆的輸出。
下面這個du的變種會間歇打印內容不過隻有在調用時提供了-v的flag才會顯示程序進度信息。在roots目録上循環的後goroutine在這里保持不變。主goroutine現在使用了計時器來每500ms生成事件然後用select語句來等待文件大小的消息來更新總大小數據或者一個計時器的事件來打印當前的總大小數據。如果-v的flag在運行時沒有傳入的話tick這個channel會保持爲nil這樣在select里的case也就相當於被禁用了。
下面這個du的變種會間歇打印內容不過隻有在調用時提供了-v的flag才會顯示程序進度信息。在roots目録上循環的後goroutine在這里保持不變。主goroutine現在使用了計時器來每500ms生成事件然後用select語句來等待文件大小的消息來更新總大小數據或者一個計時器的事件來打印當前的總大小數據。如果-v的flag在運行時沒有傳入的話tick這個channel會保持爲nil這樣在select里的case也就相當於被禁用了。
```go
gopl.io/ch8/du2

View File

@@ -82,7 +82,7 @@ func dirents(dir string) []os.FileInfo {
}
```
現在當取消發生時,所有後的goroutine都會迅速停止併且主函數會返迴。當然當主函數返迴時一個程序會退出而我們又無法在主函數退出的時候確認其已經釋放了所有的資源(譯註:因爲程序都退出了,你的代碼都沒法執行了)。這里有一個方便的竅門我們可以一用取代掉直接從主函數返迴我們調用一個panic然後runtime會把每一個goroutine的棧dump下來。如果main goroutine是唯一一個剩下的goroutine的話他會清理掉自己的一切資源。但是如果還有其它的goroutine沒有退出他們可能沒辦法被正確地取消掉也有可能被取消但是取消操作會很花時間所以這里的一個調研還是很有必要的。我們用panic來穫取到足夠的信息來驗證我們上面的判斷看看最終到底是什麽樣的情況。
現在當取消發生時,所有後的goroutine都會迅速停止併且主函數會返迴。當然當主函數返迴時一個程序會退出而我們又無法在主函數退出的時候確認其已經釋放了所有的資源(譯註:因爲程序都退出了,你的代碼都沒法執行了)。這里有一個方便的竅門我們可以一用取代掉直接從主函數返迴我們調用一個panic然後runtime會把每一個goroutine的棧dump下來。如果main goroutine是唯一一個剩下的goroutine的話他會清理掉自己的一切資源。但是如果還有其它的goroutine沒有退出他們可能沒辦法被正確地取消掉也有可能被取消但是取消操作會很花時間所以這里的一個調研還是很有必要的。我們用panic來穫取到足夠的信息來驗證我們上面的判斷看看最終到底是什麽樣的情況。
練習8.10: HTTP請求可能會因http.Request結構體中Cancel channel的關閉而取消。脩改8.6節中的web crawler來支持取消http請求。

View File

@@ -1,6 +1,6 @@
# 第八章 Goroutines和Channels
併發程序指的是同時做好幾件事情的程序隨着硬件的發展併發程序顯得越來越重要。Web服務器會一次處理成韆上萬的請求。平闆電腦和手機app在渲染用戶動畵的同時還會後執行各種計算任務和網絡請求。卽使是傳統的批處理問題--讀取數據,計算,寫輸出--現在也會用併發來隱藏掉I/O的操作延遲充分利用現代計算機設備的多覈盡管計算機的性能每年都在增長但併不是線性。
併發程序指的是同時做好幾件事情的程序隨着硬件的發展併發程序顯得越來越重要。Web服務器會一次處理成韆上萬的請求。平闆電腦和手機app在渲染用戶動畵的同時還會後執行各種計算任務和網絡請求。卽使是傳統的批處理問題--讀取數據,計算,寫輸出--現在也會用併發來隱藏掉I/O的操作延遲充分利用現代計算機設備的多覈盡管計算機的性能每年都在增長但併不是線性。
Go語言中的併發程序可以用兩種手段來實現。這一章會講解goroutine和channel其支持“順序進程通信”(communicating sequential processes)或被簡稱爲CSP。CSP是一個現代的併發編程模型在這種編程模型中值會在不同的運行實例(goroutine)中傳遞盡管大多數情況下被限製在單一實例中。第9章會覆蓋到更爲傳統的併發模型多線程共享內存如果你在其它的主流語言中寫過併發程序的話可能會更熟悉一些。第9章同時會講一些本章不會深入的併發程序帶來的重要風險和陷阱。