Go 言語は同時プログラミングを中心に設計された言語で、軽量のスレッド (ゴルーチン) と拡張可能な通信メカニズムを備えているため、同時データの処理を非常に効率的に行うことができます。この記事では、ゴルーチンとチャネルを使用して Go で同時データ処理を実装する方法を紹介します。
Goroutine は、Go のランタイム システムによって管理される軽量のスレッドです。従来のスレッド モデルとは異なり、ゴルーチンは非常に迅速に作成および破棄され、開発者は数千のゴルーチンを同時に実行できるため、Go は同時データの処理に非常に適しています。
ゴルーチンを作成するには、キーワード go
を使用できます。例:
go func() { // goroutine的执行代码 }()
キーワード go
を使用すると、 new goroutine で匿名関数を実行します。この関数は現在のスコープ内の変数にアクセスできるため、非同期コードを記述する場合に非常に便利です。
実際、ゴルーチンを使用して同時データを処理するプロセスは、通常の関数を使用してデータを処理するプロセスと似ています。たとえば、100 個の要素を含む int 型のスライスがあり、そのすべての要素に 1 を加えてその合計を計算するとします。次のように記述できます。
func main() { nums := []int{1, 2, 3, ..., 100} sum := 0 for _, num := range nums { go func(n int) { sum += n + 1 }(num) } time.Sleep(time.Second) // 等待所有goroutine完成 fmt.Println(sum) // 输出10100 }
上記のコードでは、次のように記述します。各要素のゴルーチンを作成し、それに 1 を加算し、結果を加算して合計を計算します。 goroutine は非同期で実行されるため、time.Sleep
を使用してすべての goroutine が完了するのを待つ必要があることに注意してください。
メソッド内で goroutine を呼び出すと、呼び出しスタックに新しい goroutine が作成されます。これらの goroutine は元の goroutine とヒープとスタックを共有し、同じ変数にアクセスできます。この同時実行アプローチにより、データを同時に効率的に処理できるようになります。ただし、共有変数はデータ競合を引き起こす可能性があるため、共有変数への同時アクセスが同期されていることを確認する必要があることに注意することが重要です。
この問題を解決するために、Go はチャネルを提供します。チャネルは、ゴルーチンがゴルーチン間でデータを安全に送受信できるようにする同期メカニズムです。 make
関数を使用してチャネルを作成できます。例:
ch := make(chan int)
これにより、int 型のチャネルが作成され、そのキャッシュに値を入れるか、送信することができます。そして値を受け取ります。
データをチャネルに送信するには、<-
演算子を使用します。
ch <- 1 // 将1发送到通道
データを受信するには、<-
演算子を使用します。
x := <-ch // 从通道中接收一个值,并将其赋值给x
チャネル操作がブロックされています。これは、空のチャネルからデータを受信しようとすると、送信できるデータが存在するまでプログラムがブロックされることを意味します。同様に、いっぱいになっているチャネルにデータを送信しようとすると、別の goroutine がデータを受信できるようになるまでプログラムはブロックされます。
チャネルを使用してゴルーチン間でデータを同期できます。たとえば、毎回チャネルから 2 つの数値を受け取り、それらを加算するチャネルがあるとします。これは簡単な例です:
func sum(ch chan int, nums ...int) { for _, n := range nums { ch <- n } close(ch) } func main() { ch := make(chan int) go sum(ch, 1, 2, 3, 4, 5) // 将1,2,3,4,5发送到通道ch中 sum := 0 for n := range ch { sum += n } fmt.Println(sum) // 输出15 }
上の例では、まずチャネル ch
を作成し、任意の数のデータを受信する sum
関数のゴルーチンを開始します。番号を取得してチャネルに送信します。次に、main 関数で、単純な for ループを使用してチャネルからデータを読み取り、それらを加算します。
チャネル操作はブロックされているため、チャネルを使用するときはデッドロックの問題に特に注意してください。データを読み取る前に閉じられたチャネルにデータを送信したり、すでに空になっているチャネルからデータを読み取ったりすると、プログラムはブロックされ、終了できなくなります。
つまり、Go 言語の同時実行モデルは同時データの処理に非常に適しており、ゴルーチンとチャネルを使用して効率的な同時処理を簡単に実現できます。ただし、同時実行モデルを使用する場合は、プログラムの正確さと有効性を確保するために、データ競合とデッドロックに特に注意する必要があります。
以上がgolangで同時にデータを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。