ホームページ > バックエンド開発 > Golang > Golang の同時実行モード: チャネルとパイプライン

Golang の同時実行モード: チャネルとパイプライン

王林
リリース: 2023-08-09 10:05:05
オリジナル
1504 人が閲覧しました

Golang 中的并发模式之 Channels 和 Pipelines

Golang の同時実行モード: チャネルとパイプライン

Golang では、ゴルーチンを使用して同時プログラミングを実装できます。実際の開発では、並行タスクのデータ フローを処理する必要があることがよくあります。 Golang は、この状況に対処するために、チャネルとパイプラインという 2 つの同時実行モードを提供します。

チャネルは Golang の非常に強力な同時実行プリミティブであり、ゴルーチン間でデータを渡すために使用されます。これにより、データの同期と安全な配信が保証されます。チャネル上でデータを送受信することで、ゴルーチン間の順序と同期が保証されます。

Pipelines は、複数の goroutine を接続してデータ フローを処理する同時実行モードです。各ゴルーチンには入力チャネルと出力チャネルがあり、それらをチェーンすることで、すべてのゴルーチン間でデータが流れて処理されます。

まず、チャネルの基本的な使い方を見てみましょう。 Golang では、make() 関数を使用してチャネルを作成できます。

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

<- 演算子を使用してチャネルにデータを送信できます。たとえば、

ch <- 10
ログイン後にコピー

を使用し、<-オペレータ チャネルからデータを受信します。例:

x := <-ch
ログイン後にコピー

データが利用可能になるまで、受信操作はブロックされることに注意してください。他のゴルーチンがデータを受信する準備ができるまで、送信操作もブロックされます。

次は、チャネルを使用して、生成された乱数を別の goroutine に送信する簡単な例です。

package main

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

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

    go randomGenerator(ch) // 启动生成随机数的 goroutine

    // 等待接收随机数并打印
    for i := 0; i < 10; i++ {
        num := <-ch
        fmt.Println("Received random number:", num)
        time.Sleep(1 * time.Second)
    }
}

func randomGenerator(ch chan int) {
    for {
        // 生成随机数并发送到 channel
        num := rand.Intn(100)
        ch <- num
    }
}
ログイン後にコピー

上の例では、randomGenerator() を渡します。関数は乱数を生成し、それを ch チャネルに送信します。 main 関数はチャネルから乱数を受け取り、それらを出力します。

次に、パイプラインの同時実行モードを紹介します。パイプラインには複数のゴルーチンが含まれており、それらをカスケード接続することで、データ フローを処理するネットワークを構築できます。

数値のリストがあり、リスト内の各数値を二乗して結果を出力したいとします。この機能を実装するには 2 つのゴルーチンを使用できます。1 つは平方を計算し、もう 1 つは結果を出力します。

package main

import (
    "fmt"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    input := make(chan int)
    output := make(chan int)

    // 启动计算平方的 goroutine
    go square(input, output)

    // 启动打印结果的 goroutine
    go printer(output)

    // 将数字发送到 input channel
    for _, num := range numbers {
        input <- num
    }

    // 关闭 input channel,表示数据发送完毕
    close(input)

    // 等待所有结果被打印
    <-output
}

func square(input chan int, output chan int) {
    for num := range input {
        // 计算平方,并发送结果到 output channel
        result := num * num
        output <- result
    }

    // 关闭 output channel,表示计算完毕
    close(output)
}

func printer(output chan int) {
    for result := range output {
        // 打印结果
        fmt.Println("Result:", result)
    }

    // 发送信号表示输出完毕
    output <- 0
}
ログイン後にコピー

上の例では、まず input チャネルと output チャネルを作成します。次に、2 つのゴルーチンを開始しました。square() は二乗演算を計算するために使用され、結果を output チャネルに送信します。printer() は # から使用されます。 # #output チャネルで結果を受信し、出力します。

main 関数では、for ループを使用して数値を input チャネルに送信します。次に、input チャネルを閉じて、データが送信されたことを示します。最後に、すべての結果が出力されたことを示す信号を output チャネルから受信するのを待ちます。

チャネルとパイプラインを使用すると、データ ストリームの同時処理を簡単に実装できます。これらは Golang に同時プログラミングの強力かつ簡潔な方法を提供し、同時タスクを効率的に処理できるようにします。単純なデータ転送であっても、複雑なデータ処理ネットワークであっても、これら 2 つの同時実行モードは、効率的で信頼性の高い同時実行プログラムを作成するのに役立ちます。

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

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