golang 関数とパイプライン間の通信のパターン

王林
リリース: 2024-05-01 21:51:01
オリジナル
598 人が閲覧しました

Go 言語の関数間で通信するためにパイプを使用するモードは 2 つあります。プロデューサー/コンシューマー モード: プロデューサー関数はパイプに書き込み、コンシューマー関数はパイプを読み取ります。作業プールのパターン: 1 つの関数が作業パイプラインを作成し、他の関数がパイプラインから作業を受け取って実行します。

golang 関数とパイプライン間の通信のパターン

Go 言語の関数とパイプ間の通信モード

パイプラインは、Go 言語の同時通信に効果的なメカニズムです。パイプは、パイプの一端に書き込み、もう一端から読み取ることができる要素のバッファリングされたキューです。このプロセスでは、パイプを使用して実行を同期し、関数間でデータを渡すことができます。

1. パイプの送受信

パイプは、任意の数の int を保持できる int チャネルとして初期化できます。 make 関数はパイプラインの作成に使用されます:

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

コルーチン内のパイプラインに値を送信できます。chan <-:

を使用します。
go func() {
    numbers <- 42
    close(numbers)
}()
ログイン後にコピー

<-chan を使用してパイプから値を読み取ることができます:

var num int
num = <-numbers
ログイン後にコピー

close この関数はパイプを閉じるために使用され、次のことを示します。これ以上データはパイプに書き込まれません:

close(numbers)
ログイン後にコピー

2. バッファリングされたパイプ

##パイプはバッファリング解除できます。つまり、保存できる要素は 1 つだけです。パイプ。パイプがいっぱいになると、書き込み操作はブロックされます。バッファ付きパイプは、2 番目のパラメータ

bufferSize:

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

を指定することで作成できます。これで、パイプは最大 10 個の要素を保持できるようになり、バッファがいっぱいになるまで書き込みはブロックされなくなります。

3. 関数とパイプライン間の通信モード

関数とパイプライン間の通信には 2 つの一般的なモードがあります。

  • Producer -Consumer モード: プロデューサー関数はパイプに値を書き込み、コンシューマー関数はパイプから値を読み取ります。たとえば、ある関数はファイルを読み取り、ファイルのコンテンツをパイプに送信し、別の関数はパイプからコンテンツを受信して​​処理します。
  • ワーク プール モード: 1 つの関数が作業のパイプラインを作成し、他の関数がパイプラインから作業を受け取って実行します。たとえば、ある関数はリクエストを受信して​​パイプラインに作業を追加し、別の関数はパイプラインからリクエストを取得して処理します。

4. 実践的なケース: プロデューサー/コンシューマー パターン

次は、関数間のパイプラインを使用して本番環境のプロデューサー/コンシューマー パターンを実現する方法を示す簡単な例です。 :

package main

import (
    "fmt"
    "sync"
)

func producer(ch chan int) {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}

func consumer(ch chan int, wg *sync.WaitGroup) {
    for num := range ch {
        fmt.Println(num)
    }
    wg.Done()
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup
    wg.Add(1)
    go producer(ch)
    go consumer(ch, &wg)
    wg.Wait()
}
ログイン後にコピー
この例では、

Producer 関数は 10 個の整数をパイプに書き込み、パイプを閉じます。 consumer この関数はパイプから整数を読み取り、出力します。 Producer 関数が完了する前に consumer 関数が終了しないようにするために、同期には sync.WaitGroup が使用されます。

以上がgolang 関数とパイプライン間の通信のパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!