Go 言語の関数間で通信するためにパイプを使用するモードは 2 つあります。プロデューサー/コンシューマー モード: プロデューサー関数はパイプに書き込み、コンシューマー関数はパイプを読み取ります。作業プールのパターン: 1 つの関数が作業パイプラインを作成し、他の関数がパイプラインから作業を受け取って実行します。
Go 言語の関数とパイプ間の通信モード
パイプラインは、Go 言語の同時通信に効果的なメカニズムです。パイプは、パイプの一端に書き込み、もう一端から読み取ることができる要素のバッファリングされたキューです。このプロセスでは、パイプを使用して実行を同期し、関数間でデータを渡すことができます。
1. パイプの送受信
パイプは、任意の数の int を保持できる int チャネルとして初期化できます。 make
関数はパイプラインの作成に使用されます:
numbers := make(chan int)
コルーチン内のパイプラインに値を送信できます。chan :
go func() { numbers <- 42 close(numbers) }()
を使用してパイプから値を読み取ることができます:
var num int num = <-numbers
close
この関数はパイプを閉じるために使用され、次のことを示します。これ以上データはパイプに書き込まれません:
close(numbers)
2. バッファリングされたパイプ
##パイプはバッファリング解除できます。つまり、保存できる要素は 1 つだけです。パイプ。パイプがいっぱいになると、書き込み操作はブロックされます。バッファ付きパイプは、2 番目のパラメータbufferSize:
numbers := make(chan int, 10)を指定することで作成できます。これで、パイプは最大 10 個の要素を保持できるようになり、バッファがいっぱいになるまで書き込みはブロックされなくなります。
3. 関数とパイプライン間の通信モード
関数とパイプライン間の通信には 2 つの一般的なモードがあります。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 サイトの他の関連記事を参照してください。