ホームページ > バックエンド開発 > Golang > Go で非同期に実行されているゴルーチンから戻り値を取得するにはどうすればよいですか?

Go で非同期に実行されているゴルーチンから戻り値を取得するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-26 01:03:11
オリジナル
269 人が閲覧しました

How Do I Retrieve Return Values from Asynchronously Running Goroutines in Go?

ゴルーチンからの戻り値のキャッチ

従来の関数呼び出しとは異なり、ゴルーチンは非同期で実行されます。その結果、コード スニペットに見られるように、ゴルーチンの戻り値を変数に直接格納しようとすると、コンパイル エラーが発生します。

エラーの理由

このエラーは、非同期実行と即時値の取得の矛盾する性質から発生します。 go で goroutine を使用する場合、関数の完了を待たずに非同期で関数を実行するようにプログラムに指示します。ただし、戻り値を変数に割り当てるには、その値がすぐに利用可能である必要があります。

チャネル: 非同期値渡しメカニズム

この制限を回避するために、チャネルはゴルーチン間の値交換の仲介者として。チャネルを使用すると、あるゴルーチンから別のゴルーチンに値を送信でき、同時実行性を損なうことなく非同期の値の取得が可能になります。

以下のコードに例示されているようにチャネルベースのアプローチを実装すると、ゴルーチンの値を損なうことなくゴルーチンから値を受け取ることができます。非同期性質:

func main() {
    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        time.Sleep(time.Second * 1)
        c1 <- "one"
    }()
    go func() {
        time.Sleep(time.Second * 2)
        c2 <- "two"
    }()

    for i := 0; i < 2; i++ {
        // Receive values from both channels concurrently
        select {
        case msg1 := <-c1:
            fmt.Println("received", msg1)
        case msg2 := <-c2:
            fmt.Println("received", msg2)
        }
    }
}
ログイン後にコピー

メッセージパッシングと CSP 理論

Go のメッセージング システムは、CSP (Communicating Sequential Processes) 理論からインスピレーションを得ています。このアプローチは、独立したプロセス間の主要な通信メカニズムとしてメッセージ パッシングを促進します。サンプルコードは、ゴルーチン間の非同期通信にチャネルを利用することで CSP の原則に従っています。

以上がGo で非同期に実行されているゴルーチンから戻り値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート