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

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

PHPz
リリース: 2023-06-10 10:33:07
オリジナル
956 人が閲覧しました

コンピュータ ハードウェアの継続的な開発に伴い、プロセッサ内の 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 サイトの他の関連記事を参照してください。

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