Go のコルーチンと async/await は同時実行プリミティブ、コルーチンは軽量の実行スレッド、async/await は糖衣構文であり、非同期コードの記述が可能です。コルーチンはゴルーチン内で実行され、go キーワードを使用して作成されます。 async/await は、async キーワードを使用してコルーチンを定義し、await キーワードを使用して現在のコルーチンを一時停止し、他のコルーチンが完了するのを待ちます。実際には、コルーチンを使用して同時リクエストを管理し、ゴルーチン プールを介してリクエストごとにコルーチンを作成および破棄するオーバーヘッドを回避できます。
Go では、コルーチンと async/await は、同時コードの書き込みに使用される 2 つの同時実行プリミティブです。
Coroutine は、複数の場所で同時にコードを実行できる軽量の実行スレッドです。コルーチンは、Go 言語のユーザーモード スレッドの実装である goroutine で実行されます。
以下は、コルーチンを作成して使用するためのコード例です。
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 を使用して、さまざまな同時実行の問題を解決できます。最も一般的な使用法の 1 つは、ゴルーチン プールを使用して同時リクエストを管理することです。
以下は、ゴルーチン プールを使用して 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 中国語 Web サイトの他の関連記事を参照してください。