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