Golang協程與 async/await

WBOY
發布: 2024-04-15 12:57:02
原創
686 人瀏覽過

Go中協程和 async/await 是並發原語,協程是輕量級執行線程,async/await 是語法糖,允許非同步程式碼編寫。協程在 goroutine 中運行,使用 go 關鍵字建立。 async/await 定義協程使用 async 關鍵字,暫停目前協程等待其他協程完成用 await 關鍵字。在實戰中,協程可用於管理並發請求,透過 goroutine 池避免為每個請求建立和銷毀協程的開銷。

Golang协程与 async/await

Go中協程與async/await 的比較

在Go 中,協程和async/await 是兩種並發原語,用於編寫並發程式碼。

協程

協程是輕量級的執行線程,它允許我們同時在多個地方執行程式碼。協程在 goroutine 中運行,goroutine 是 Go 語言對使用者態執行緒的實作。

以下是建立和使用協程的程式碼範例:

package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { fmt.Println(i) wg.Done() }(i) } wg.Wait() }
登入後複製

async/await

async/await 是一個語法糖,它允許我們編寫非同步程式碼,就像它是在同步程式碼中執行一樣。 async 關鍵字用於定義一個協程,而 await 關鍵字用於暫停目前協程並等待另一個協程完成。

以下是建立和使用 async/await 的程式碼範例:

package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup wg.Add(1) result := asyncFunc() fmt.Println(result) wg.Wait() } func asyncFunc() int { return 42 }
登入後複製

實戰案例

我們可以使用協程和 async/await 來解決各種並發問題。最常見的用途之一是透過使用 goroutine 池來管理並發請求。

以下是使用 goroutine 池處理 HTTP 請求的 Go 程式碼範例:

package main import ( "fmt" "net/http" "sync" ) var pool = sync.Pool{ New: func() interface{} { return new(http.Request) }, } func handler(w http.ResponseWriter, r *http.Request) { // 从池中检索请求 req := pool.Get().(*http.Request) *req = *r // 处理请求 // 将请求放回池中 pool.Put(req) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
登入後複製

透過使用協程池,我們避免了為每個請求建立和銷毀協程的開銷。這可以顯著提高並發請求的處理效能。

以上是Golang協程與 async/await的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!