首頁 > 後端開發 > Golang > golang函數的非同步程式設計實踐

golang函數的非同步程式設計實踐

王林
發布: 2024-04-28 21:27:02
原創
682 人瀏覽過

非同步程式設計允許在不阻塞主執行緒的情況下執行任務。 Go 語言使用輕量級執行緒 goroutine 和通訊管道 channel 實現非同步程式設計。 goroutine 透過 go 關鍵字創建,而 channel 用於在 goroutine 之間發送和接收資料。實戰案例:並發 web 請求使用一個 channel 來接收請求回應,並透過 goroutine 並發發送 HTTP GET 請求。主執行緒從 channel 接收回應並列印結果,提高了程式效能和回應能力。

golang函數的非同步程式設計實踐

Go 語言函數的非同步程式設計實踐

#非同步程式設計是平行程式設計的一種技術,它允許程式設計師在不阻塞主執行緒的情況下執行多個任務。在 Go 語言中,使用 goroutinechannel 可以輕鬆實現非同步程式設計。

Goroutine

Goroutine 是 Go 語言中的輕量級執行緒。與傳統線程不同,goroutine 非常輕量,並由 Go 運行時管理。使用 go 關鍵字可以建立 goroutine。

go func() {
  // 异步任务
}
登入後複製

channel

channel 是 Go 語言用來在 goroutine 之間溝通的管道。 channel 可以被用於發送和接收資料。

ch := make(chan int)  // 创建一个无缓冲 channel

// 向 channel 发送数据
ch <- 42

// 从 channel 接收数据
x := <-ch
登入後複製

實戰案例:並發web 請求

以下是一個非同步並發web 請求的實戰案例:

package main

import (
  "fmt"
  "net/http"
  "time"
)

func main() {
  // 创建一个 channel 来接收请求响应
  results := make(chan string)

  // 发送并发请求
  for i := 0; i < 10; i++ {
    go func(i int) {
      // 发送 HTTP GET 请求
      resp, err := http.Get(fmt.Sprintf("https://example.com/%d", i))
      if err != nil {
        results <- fmt.Sprintf("Error: %v", err)
        return
      }

      // 接收响应并发送结果
      body, err := ioutil.ReadAll(resp.Body)
      if err != nil {
        results <- fmt.Sprintf("Error: %v", err)
        return
      }

      results <- fmt.Sprintf("Response: %s", string(body))
    }(i)
  }

  // 接收并发请求的响应
  for j := 0; j < 10; j++ {
    fmt.Println(<-results)
  }
}
登入後複製

這個程式創建了一個channel 來接收請求回應,然後啟動10 個goroutine 並發發送HTTP GET 請求。每個 goroutine 在收到回應後將結果發送到 channel。主執行緒從 channel 接收結果並列印到控制台。

透過非同步編程,這個程式可以在不阻塞主執行緒的情況下並發處理請求,從而提高了應用程式的效能和回應能力。

以上是golang函數的非同步程式設計實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板