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