チャネルを通じて Golang の Goroutine を同期する方法
Goroutine は、1 つのプログラムで複数のタスクを並行して実行できる Golang の軽量スレッドです。 Goroutine では、データ通信と同期にチャネルを使用できます。チャネルは、データの正確性と同期を確保するためのゴルーチン間の通信メカニズムを提供します。
Golang では、チャネルはゴルーチン間でデータを渡すために使用されるタイプセーフな要素です。チャネルを使用すると、ゴルーチン間の同期を実現し、データが正しい時間と順序で配信および処理されることを保証できます。
次に、Goroutine がチャネルを通じてどのように同期するかを示すサンプル コードを見てみましょう:
package main import ( "fmt" "time" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("Worker", id, "started job", j) time.Sleep(time.Second) fmt.Println("Worker", id, "finished job", j) results <- j * 2 } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) // 启动三个 Goroutine 执行任务 for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 发送任务到 Jobs Channel for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 从 Results Channel 中接收结果 for a := 1; a <= 5; a++ { <-results } time.Sleep(time.Second) }
上の例では、2 つのチャネル: jobs
と を作成しました。結果###。
jobs はタスクを Goroutine に送信するために使用され、
results はタスクの実行結果を受信するために使用されます。
go キーワードを使用して 3 つのゴルーチンを開始し、それぞれに必要な
jobs チャネルと
results チャネルを渡しました。次に、5 つのタスクをループ内で
jobs チャネルに送信し、完了したら
jobs チャネルを閉じます。
worker 関数では、
range キーワードを使用して
jobs チャネルからタスクを継続的に受信し、タスクの処理後に結果を
results チャンネルに送信します。チャネルがブロックしているため、
jobs チャネルからタスクを受信すると、Goroutine は停止し、次のタスクの到着を待ちます。
range キーワードを使用して、
results チャネルから結果を継続的に受信します。タスクの実行後、
< を渡します。 -results 式は、結果データを受け取りたいことを示しますが、実際にはこれらの値を使用しません。
time.Sleep(time.Second) を使用して、Goroutine の実行直後にプログラムが終了しないようにします。
以上がGolang のチャネルを介してゴルーチンを同期する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。