ホームページ  >  記事  >  バックエンド開発  >  Golang コルーチンと同時実行モデル

Golang コルーチンと同時実行モデル

WBOY
WBOYオリジナル
2024-04-15 14:21:01387ブラウズ

Go のコルーチンは、複数のタスクを同じプロセスで実行できるようにする軽量の同時実行メカニズムです。これらはプロセス メモリ空間を共有し、チャネルを通じて通信できます。さらに、この記事では、 go キーワードを使用したコルーチンの作成についても説明します。チャネルは make 関数で作成され、コルーチン間で値を渡すために使用できます。実際のケースでは、コルーチンを使用して並列コンピューティングを実装し、8 つのコルーチンを通じて 100,000 個の素数を計算する方法を示します。

Golang コルーチンと同時実行モデル

Go コルーチンと同時実行モデル

はじめに

コルーチンは Go 軽量です複数の独立したタスクを同じプロセスで実行できるようにする言語の同時実行メカニズム。この記事では、Go のコルーチンと同時実行モデルについて説明し、実践的な例を示します。

Coroutine

Coroutine は Go 言語の同時実行ユニットで、スレッドに似ていますが、より軽量です。コルーチンは同じプロセスのメモリ空間を共有するため、データを簡単に共有できます。次のように go キーワードを使用してコルーチンを作成します。

go func() {
    // 协程体
}

Channel

Channel は Go の通信メカニズムであり、コルーチン間の値の受け渡しに使用されます。チャネルは単方向または双方向にすることができ、バッファリングすることもバッファリングしないこともできます。以下に示すように、make 関数を使用してチャネルを作成します。

ch := make(chan int, 10)

実践的なケース: 並列コンピューティング

コルーチンを使用して、並列コンピューティングの実際的なケースを実装してみましょう。コルーチン プールを作成し、各コルーチンで大きな素数テーブルを計算します。

package main

import (
    "fmt"
    "math/rand"
    "time"
)

const primeCount = 100000

// 计算素数
func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

// 协程函数
func parallelPrimes(ch chan int) {
    for i := 0; i < primeCount; i++ {
        n := rand.Intn(100000)
        if isPrime(n) {
            ch <- n
        }
    }
}

func main() {
    // 创建通道和协程池
    ch := make(chan int, primeCount)
    for i := 0; i < 8; i++ {
        go parallelPrimes(ch)
    }

    // 等待协程池完成
    close(ch)

    start := time.Now()
    // 收集素数
    for prime := range ch {
        fmt.Println(prime)
    }
    elapsed := time.Since(start)
    fmt.Printf("Elapsed time: %v\n", elapsed)
}

この場合、8 つのコルーチンを作成し、各コルーチンが 100,000 個の素数の計算を担当します。メイン コルーチンは、素数を収集してコンソールに出力する役割を果たします。

以上がGolang コルーチンと同時実行モデルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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