1.6 併發獲取多個url
go最令人感興趣和新穎的特點是支援併發程式設計。這是乙個大話題,第8章和第9章將專門討論,所以此處只是簡單了解一下go主要的併發機制、goroutine和通道(channel)。
這有乙個例子:
goroutine是乙個併發執行的函式。通道是一種允許某一例程向另乙個例程傳遞指定型別的值的通訊機制。main函式在乙個goroutine中執行,然後go語句建立額外的goroutine。
main函式使用make建立乙個字串通道。對於每個命令列引數,go語句在第一輪迴圈中啟動乙個新的goroutine,它非同步呼叫fetch來使用http.get獲取url內容。io.copy函式讀取響應的內容,然後通過寫入ioutil.discard輸出流進行丟棄。copy返回位元組數以及出現的任何錯誤。每乙個結果返回時,fetch傳送一行彙總資訊到通道ch。main中的第二輪迴圈接收並且輸出那些彙總行。
當乙個goroutine試圖在乙個通道上進行傳送或接收操作時,它會阻塞,直到另乙個goroutine試圖進行接收或傳送操作才傳遞值,並開始處理兩個goroutine。本例中,每乙個fetch在通道ch上傳送乙個值(ch <- expression),main函式接收它們(<-ch)。由main來處理所有的輸出確保了每個goroutine作為乙個整體單元處理,這樣就避免了兩個goroutine同時完成造成輸出交織所帶來的風險。
練習1.10:找乙個產生大量資料的**。連續兩次執行fetchall,看報告的時間是否會有大的變化,調查快取情況。每一次獲取的內容一樣嗎?修改fetchall將內容輸出到檔案,這樣可以檢查它是否一致。
練習1.11:使用更長的引數列表來嘗試fetchall,例如使用alexa.com排名前100萬的**。如果乙個**沒有響應,程式的行為是怎樣的?(8.9節會通過複製這個例子來描述響應的機制。)
Go語言聖經習題練習 1 6併發獲取多個URL
練習 1.10 找乙個資料量比較大的 用本小節中的程式調研 的快取策略,對每個url執行兩遍請求,檢視兩次時間是否有較大的差別,並且每次獲取到的響應內容是否一致,修改本節中的程式,將響應結果輸出,以便於進行對比。練習 1.11 在fatchall中嘗試使用長一些的引數列表,比如使用在alexa.co...
go語言學習 併發獲取多個url
ch fmt.sprintf 2fs 7d s secs,nbytes,url 將格式化資訊寫入通道 go語言使用go 關鍵字建立協程併發處理資訊 make 建立 chan 通道,進行資訊傳遞,如果ch 通道沒有訊息,go會一直阻塞 ch fmt.sprintf while reading s v ...
日常 GO語言聖經 併發獲取多個URL
go語言聖經 併發獲取多個url 1.go最新奇的特性就是對併發程式設計的支援,goroutine和channel 2.goroutine是一種函式的併發執行方式,而channel是用來在goroutine之間進行引數傳遞 go function則表示建立乙個新的goroutine,並在這個新的go...