ホームページ  >  記事  >  バックエンド開発  >  Golang コルーチンと async/await

Golang コルーチンと async/await

WBOY
WBOYオリジナル
2024-04-15 12:57:02784ブラウズ

Go のコルーチンと async/await は同時実行プリミティブ、コルーチンは軽量の実行スレッド、async/await は糖衣構文であり、非同期コードの記述が可能です。コルーチンはゴルーチン内で実行され、go キーワードを使用して作成されます。 async/await は、async キーワードを使用してコルーチンを定義し、await キーワードを使用して現在のコルーチンを一時停止し、他のコルーチンが完了するのを待ちます。実際には、コルーチンを使用して同時リクエストを管理し、ゴルーチン プールを介してリクエストごとにコルーチンを作成および破棄するオーバーヘッドを回避できます。

Golang协程与 async/await

Go におけるコルーチンと async/await の比較

Go では、コルーチンと async/await は、同時コードの書き込みに使用される 2 つの同時実行プリミティブです。

Coroutine

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 キーワードは現在のコルーチンを一時停止し、別のコルーチンが完了するのを待つために使用されます。

次は、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。