目次
コルーチン
チャネル
WaitGroup
ホームページ バックエンド開発 Golang 同時プログラミングに Go 言語を使用するにはどうすればよいですか?

同時プログラミングに Go 言語を使用するにはどうすればよいですか?

Jun 10, 2023 am 10:33 AM
言語を移動 同時プログラミング 利用

コンピュータ ハードウェアの継続的な開発に伴い、プロセッサ内の CPU コアは個別にクロック周波数を高めるのではなく、コアの数が増加しています。これにより、これらのコアを最大限に活用するにはどうすればよいかという明らかな疑問が生じます。

解決策の 1 つは、複数のタスクを同時に実行して CPU コアを最大限に活用する並列プログラミングによるものです。これは Go 言語の独特な点であり、同時プログラミング用に設計された言語です。

この記事では、Go 言語を使用して同時プログラミングを行う方法について説明します。

コルーチン

まず第一に、Go 言語の特別なメカニズムであるコルーチンを理解する必要があります。コルーチンは、1 つのスレッド内で実行を複数回切り替えて並列実行を実現できる軽量のスレッドです。

オペレーティング システムのスレッドと比較すると、コルーチンのスイッチング コストは非常に低くなります。これらは Go ランタイムによって管理され、m:n マッピングを使用して m 個のコルーチンを n 個のオペレーティング システム スレッドにマッピングします。これにより、Go 言語は同時実行機能において非常に効率的かつ安定したものになります。

Go 言語では、go キーワードを使用してコルーチンを開始できます。例:

func main() {
    go hello()
}

func hello() {
    fmt.Println("Hello, world!")
}
ログイン後にコピー

上記のコードでは、hello() 関数が新しいコルーチンで実行されます。プログラムが main() 関数を終了するとき、hello() 関数がまだ実行されている可能性があるため、プログラムはすぐには終了しません。

チャネル

コルーチン間の通信はデータを共有する必要があるため、非常に重要です。 Go 言語にはチャネルと呼ばれる特別なタイプの変数があり、コルーチン間でデータを転送するために使用されます。

make() 関数を使用してチャネルを作成できます。例:

ch := make(chan int)
ログイン後にコピー

上記のコードは、整数型のチャネルを作成します。

データは、チャネルの送信操作と受信操作を通じて渡すことができます。チャンネルは、<- 演算子を使用して送受信できます。例:

ch <- 42 // 发送数据
x := <-ch // 接收数据
ログイン後にコピー

<- 演算子は左側または右側でデータを送受信するために使用できます。チャネルがバッファリングされていない場合、別のコルーチンがデータを受信するまで送信操作はブロックされます。同様に、利用可能なデータがない場合、受信操作はブロックされます。

WaitGroup

複数のコルーチンを処理する場合、すべてのコルーチンが実行を完了するまで待機する必要がある場合があります。 sync.WaitGroup を使用すると、この目的を達成できます。例:

func main() {
    var wg sync.WaitGroup
    wg.Add(2) // 增加计数器

    go func() {
        defer wg.Done() // 完成时减少计数器
        fmt.Println("Hello,")
    }()

    go func() {
        defer wg.Done() // 完成时减少计数器
        fmt.Println("world!")
    }()

    wg.Wait() // 等待协程全部完成
}
ログイン後にコピー

上記のコードでは、wg はカウンターを含む sync.WaitGroup オブジェクトです。 Add() このメソッドはカウンターを増加させて、待機する必要があるコルーチンの数を示します。 Done() このメソッドはカウンターをデクリメントして、コルーチンが完了したことを示します。 Wait() このメソッドは、カウンターがゼロになるまで待機します。

以下は、同時プログラミングにコルーチンとチャネルを使用する方法を示すサンプル プログラムです。

func main() {
    ch := make(chan int)

    go func() {
        for i := 0; i < 10; i++ {
            ch <- i // 发送数据
        }
        close(ch) // 关闭通道
    }()

    for i := range ch { // 循环接收数据,直到通道关闭
        fmt.Println(i)
    }
}
ログイン後にコピー

上記のコードでは、整数型 Channel # を作成します。 ##ch。次に、0 から 9 までの整数を新しいコルーチンのチャネルに送信します。最後に、range キーワードを使用してチャネル内のデータをループし、それを出力します。

すべてのデータを送信した後、

close() メソッドを通じてチャネルを閉じることに注意してください。これにより、ループしてチャネルを読み取るコルーチンが終了できるようになります。

結論

この記事では、Go 言語のコルーチン、チャネル、

WaitGroup について学びました。これらのメカニズムを通じて、効率的な同時プログラミングを簡単に実装できます。 Go コードを作成するときは、CPU コアとハードウェア リソースを最大限に活用するために、これらのメカニズムを使用することを必ず考慮してください。

以上が同時プログラミングに Go 言語を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ 同時プログラミングにおけるデータ構造の同時実行安全設計? C++ 同時プログラミングにおけるデータ構造の同時実行安全設計? Jun 05, 2024 am 11:00 AM

C++ 同時プログラミングにおけるデータ構造の同時実行安全設計?

Go 言語でのパフォーマンス テストと単体テストの違い Go 言語でのパフォーマンス テストと単体テストの違い May 08, 2024 pm 03:09 PM

Go 言語でのパフォーマンス テストと単体テストの違い

C++ の同時プログラミング フレームワークとライブラリは何ですか?それぞれの利点と制限は何ですか? C++ の同時プログラミング フレームワークとライブラリは何ですか?それぞれの利点と制限は何ですか? May 07, 2024 pm 02:06 PM

C++ の同時プログラミング フレームワークとライブラリは何ですか?それぞれの利点と制限は何ですか?

Golang テクノロジーを使用して分散システムを設計する場合、どのような落とし穴に注意する必要がありますか? Golang テクノロジーを使用して分散システムを設計する場合、どのような落とし穴に注意する必要がありますか? May 07, 2024 pm 12:39 PM

Golang テクノロジーを使用して分散システムを設計する場合、どのような落とし穴に注意する必要がありますか?

C++ 同時プログラミングの同期プリミティブの詳細な説明 C++ 同時プログラミングの同期プリミティブの詳細な説明 May 31, 2024 pm 10:01 PM

C++ 同時プログラミングの同期プリミティブの詳細な説明

機械学習で使用される Golang テクノロジー ライブラリとツール 機械学習で使用される Golang テクノロジー ライブラリとツール May 08, 2024 pm 09:42 PM

機械学習で使用される Golang テクノロジー ライブラリとツール

モバイルIoT開発におけるGolangテクノロジーの役割 モバイルIoT開発におけるGolangテクノロジーの役割 May 09, 2024 pm 03:51 PM

モバイルIoT開発におけるGolangテクノロジーの役割

同時プログラミングに最も適した golang フレームワークはどれですか? 同時プログラミングに最も適した golang フレームワークはどれですか? Jun 02, 2024 pm 09:12 PM

同時プログラミングに最も適した golang フレームワークはどれですか?

See all articles