<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 并發操作客戶端請求 在Go中,并行執行客戶端請求相對簡單。 在下面示例中,我們將使用客戶端使用Go緩沖通道執行多個URL請求。 響應和錯誤都將轉到一個單獨的通道,任何有權訪問客戶端的人都可以輕松訪問。 在本節中,創建客戶端,讀取通道以及處理響應和錯誤都將在main.go文件中完成。 ### 實踐 1. 建立 config.go: ``` package async import "net/http" // NewClient 建立一個新的client并為其分配通道 func NewClient(client *http.Client, bufferSize int) *Client { respch := make(chan *http.Response, bufferSize) errch := make(chan error, bufferSize) return &Client{ Client: client, Resp: respch, Err: errch, } } type Client struct { *http.Client Resp chan *http.Response Err chan error } // AsyncGet 執行Get然后將resp/error返回到適當的通道 func (c *Client) AsyncGet(url string) { resp, err := c.Get(url) if err != nil { c.Err <- err return } c.Resp <- resp } ``` 2. 建立 exec.go: ``` package async // FetchAll 遍歷請求所有的url func FetchAll(urls []string, c *Client) { for _, url := range urls { go c.AsyncGet(url) } } ``` 3. 建立 main.go: ``` package main import ( "fmt" "net/http" "github.com/agtorre/go-cookbook/chapter6/async" ) func main() { urls := []string{ "https://www.google.com", "https://golang.org", "https://www.github.com", } c := async.NewClient(http.DefaultClient, len(urls)) async.FetchAll(urls, c) for i := 0; i < len(urls); i++ { select { case resp := <-c.Resp: fmt.Printf("Status received for %s: %d\n", resp.Request.URL, resp.StatusCode) case err := <-c.Err: fmt.Printf("Error received: %s\n", err) } } } ``` 4. 這會輸出: ``` Status received for https://www.google.com: 200 Status received for https://golang.org: 200 Status received for https://github.com/: 200 ``` ### 說明 該示例創建了一個框架,用于使用單個客戶端以扇出異步方式處理請求。它嘗試盡可能快地檢索盡可能多的URL。 在許多情況下,你可能希望通過類似工作池的方式進一步限制此操作。在特定存儲或檢索接口時這些異步Go例程也是有借鑒意義的。 這里還使用case語句處理多個通道。我們無需擔心處理鎖定問題,因為我們非常清楚將收到多少響應。如果放棄某些響應處理,那么另一種選擇就是超時。 * * * * 學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。 Golang中國(211938256) beego實戰(258969317) Go實踐(386056972)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看