回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,8 +1,8 @@
## 1.6. 併發獲取多URL
## 1.6. 并发获取多URL
Go言最有意思且最新奇的特性就是對併發編程的支持。併發編程是一個大話題,在第八章和第九章中會專門講到。里我們隻淺嚐輒止地來體驗一下Go言里的goroutine和channel。
Go言最有意思且最新奇的特性就是对并发编程的支持。并发编程是一个大话题,在第八章和第九章中会专门讲到。里我们只浅尝辄止地来体验一下Go言里的goroutine和channel。
下面的例子fetchall和前面小的fetch程序所要做的工作基本一致fetchall的特别之處在於它會同時去獲取所有的URL所以這個程序的總執行時間不會超過執行時間最長的那一個任務前面的fetch程序執行時間則是所有任務執行時間之和。fetchall程序隻會打印取的容大小和經過的時間,不像之前那打印取的容。
下面的例子fetchall和前面小的fetch程序所要做的工作基本一致fetchall的特别之处在于它会同时去获取所有的URL所以这个程序的总执行时间不会超过执行时间最长的那一个任务前面的fetch程序执行时间则是所有任务执行时间之和。fetchall程序只会打印取的容大小和经过的时间,不像之前那打印取的容。
<u><i>gopl.io/ch1/fetchall</i></u>
```go
@@ -48,7 +48,7 @@ func fetch(url string, ch chan<- string) {
}
```
下面使用fetchall來請求幾個地址:
下面使用fetchall来请求几个地址:
```
$ go build gopl.io/ch1/fetchall
@@ -59,10 +59,10 @@ $ ./fetchall https://golang.org http://gopl.io https://godoc.org
0.48s elapsed
```
goroutine是一種函數的併發執行方式而channel是用在goroutine之間進行參數傳遞。main函本身也行在一goroutine中而go function表示建一新的goroutine併在這個新的goroutine中執行這個函數
goroutine是一种函数的并发执行方式而channel是用在goroutine之间进行参数传递。main函本身也行在一goroutine中而go function表示建一新的goroutine并在这个新的goroutine中执行这个函数
main函中用make函數創建了一個傳遞string類型參數的channel每一命令行參數,我都用go這個關鍵字來創建一goroutine併且讓函數在這個goroutine異步執行http.Get方法。這個程序里的io.Copy會把響應的Body容拷到ioutil.Discard出流中(譯註:可以把這個變量看作一垃圾桶,可以向里面一些不需要的數據),因爲我們需要這個方法返的字節數,但是又不想要其容。每當請求返迴內容時fetch函數都會往ch這個channel里入一字符串由main函里的第二for循環來處理併打印channel里的這個字符串。
main函中用make函数创建了一个传递string类型参数的channel每一命令行参数,我都用go这个关键字来创建一goroutine并且让函数在这个goroutine异步执行http.Get方法。这个程序里的io.Copy会把响应的Body容拷到ioutil.Discard出流中(译注:可以把这个变量看作一垃圾桶,可以向里面一些不需要的数据),因为我们需要这个方法返的字节数,但是又不想要其容。每当请求返回内容时fetch函数都会往ch这个channel里入一字符串由main函里的第二for循环来处理并打印channel里的这个字符串。
當一個goroutine嚐試在一channel上做send或者receive操作時,這個goroutine阻塞在調用處,直到另一goroutine往這個channel里入、或者接收值,這樣兩個goroutine才會繼續執行channel操作之後的邏輯。在這個例子中,每一fetch函數在執行時都會往channel里送一值(ch <- expression)主函數負責接收些值(<-ch)。這個程序中我用main函數來接收所有fetch函數傳迴的字符串可以避免在goroutine異步執行還沒有完成main函提前退出
当一个goroutine尝试在一channel上做send或者receive操作时,这个goroutine阻塞在调用处,直到另一goroutine往这个channel里入、或者接收值,这样两个goroutine才会继续执行channel操作之后的逻辑。在这个例子中,每一fetch函数在执行时都会往channel里送一值(ch <- expression)主函数负责接收些值(<-ch)。这个程序中我用main函数来接收所有fetch函数传回的字符串可以避免在goroutine异步执行还没有完成main函提前退出
**練習 1.10** 找一個數據量比大的用本小中的程序調研網站的存策略對每個URL執行兩遍請求査看兩次時間是否有大的差别且每次取到的響應內容是否一致改本中的程序將響應結果輸以便於進行對
**练习 1.10** 找一个数据量比大的用本小中的程序调研网站的存策略对每个URL执行两遍请求查看两次时间是否有大的差别且每次取到的响应内容是否一致改本中的程序将响应结果输以便于进行对