日常 GO語言聖經 併發獲取多個URL

2022-01-30 20:07:40 字數 2299 閱讀 9360

go語言聖經-併發獲取多個url

1.go最新奇的特性就是對併發程式設計的支援,goroutine和channel

2.goroutine是一種函式的併發執行方式,而channel是用來在goroutine之間進行引數傳遞

go function則表示建立乙個新的goroutine,並在這個新的goroutine中執行這個函式。

3.make函式建立了乙個傳遞string型別引數的channel

4.io.copy把響應的body內容拷貝到ioutil.discard輸出流中,扔到乙個垃圾桶

5.goroutine嘗試在乙個channel上做send或者receive操作時,這個goroutine會阻塞在呼叫處,直到另乙個goroutine往這個channel裡寫入、或者接收值

6.用main函式來接收所有fetch函式傳回的字串,可以避免在goroutine非同步執行還沒有完成時main函式提前退出。

練習 1.10: 找乙個資料量比較大的**,用本小節中的程式調研**的快取策略,對每個url執行兩遍請求,檢視兩次時間是否有較大的差別,並且每次獲取到的響應內容是否一致,修改本節中的程式,將響應結果輸出,以便於進行對比。

練習 1.11: 在fetchall中嘗試使用長一些的引數列表,比如使用在alexa.com的上百萬**裡排名靠前的。如果乙個**沒有回應,程式將採取怎樣的行為?(section8.9 描述了在這種情況下的應對機制)。

fetchall.go

package main

//匯入io/ioutil和net/http包

//接收並列印channel,for迴圈不需要key value

for range os.args[1:]

//main函式的時間

fmt.printf("main: %.2fs \n",time.since(start).seconds())

}//引數型別:string , chan

//判斷錯誤

if err != nil

//輸出http code

//把內容扔掉,只獲取位元組數

nbytes , err:=io.copy(ioutil.discard, res.body)

//判斷錯誤

if err != nil

res.body.close()

//記錄執行的秒數

sec := time.since(start).seconds()

//傳送給channelch}

對比fetch.go

package main

//匯入io/ioutil和net/http包

//判斷錯誤

if err != nil

//body,err := ioutil.readall(res.body)

//避免申請乙個緩衝區,直接到標準輸出流

nbytes,err:=io.copy(ioutil.discard, res.body)

//判斷錯誤

if err != nil

res.body.close()

//輸出http code

//結束時間

sec:=time.since(start).seconds()

fmt.printf("main:%.2fs\n",sec)

}

執行效果對比:

Go語言聖經習題練習 1 6併發獲取多個URL

練習 1.10 找乙個資料量比較大的 用本小節中的程式調研 的快取策略,對每個url執行兩遍請求,檢視兩次時間是否有較大的差別,並且每次獲取到的響應內容是否一致,修改本節中的程式,將響應結果輸出,以便於進行對比。練習 1.11 在fatchall中嘗試使用長一些的引數列表,比如使用在alexa.co...

日常 go語言聖經 獲取URL練習題

1.主要使用net http和io ioutil包 2.http.get函式是建立http請求的函式,resp這個結構體中,body欄位包括乙個可讀的伺服器響應流 3.ioutil.readall函式從response中讀取到全部內容,resp.body.close關閉resp的body流 4.用o...

日常 Go語言聖經 Map習題

練習 4.8 修改charcount程式,使用unicode.isletter等相關的函式,統計字母 數字等unicode中不同的字元類別。練習 4.9 編寫乙個程式wordfreq程式,報告輸入文字中每個單詞出現的頻率。在第一次呼叫scan前先呼叫input.split bufio.scanwor...