Golang でのゴルーチンとチャネルのアプリケーション エクスペリエンス
Golang は、効率的なパフォーマンスと簡潔な構文を備えたクロスプラットフォーム プログラミング言語であり、その中でもゴルーチンとチャネルは 2 つの重要な機能です。同時プログラミングの。この記事では、実際のアプリケーションでゴルーチンとチャネルを使用したいくつかの経験を共有し、コード例を通してそれらを示します。
まず第一に、Goroutine は非同期で実行できる Golang の軽量スレッドです。関数呼び出しの前に「go」キーワードを追加すると、関数コード ブロックをゴルーチンにラップできます。以下は簡単な例です:
package main import ( "fmt" "time" ) func printNumbers() { for i := 1; i <= 5; i++ { fmt.Println(i) } } func main() { go printNumbers() // 启动一个 Goroutine time.Sleep(1 * time.Second) // 等待 Goroutine 执行完毕 }
上記のコードでは、go printNumbers()
を使用して main
関数で Goroutine を開始し、## を使用します。 # time.Sleep 関数を使用して、Goroutine の実行が完了するのを待ちます。こうすることで、Goroutine の実行中にメインスレッドは他のタスクを実行し続けることができます。
package main import ( "fmt" ) func printNumbers(numbers chan int) { for i := 1; i <= 5; i++ { numbers <- i // 发送数据到 Channel } close(numbers) // 关闭 Channel } func main() { numbers := make(chan int) go printNumbers(numbers) for number := range numbers { // 从 Channel 中接收数据 fmt.Println(number) } }上記のコードでは、整数チャネル
numbers を作成し、
printNumbers 関数で
< を使用します ;- オペレーターはデータをチャネルに送信します。
main 関数の
range ループを使用して、チャネルからデータを受信します。チャネルが閉じられると、ループは自動的に終了することに注意してください。
package main import ( "fmt" ) func printNumbers(numbers chan int, done chan bool) { for i := 1; i <= 5; i++ { numbers <- i // 发送数据到 Channel } done <- true // 发送完成信号到 done Channel } func printSquares(numbers chan int, done chan bool) { for number := range numbers { // 从 numbers Channel 中接收数据 fmt.Println(number * number) } done <- true // 发送完成信号到 done Channel } func main() { numbers := make(chan int) done := make(chan bool) go printNumbers(numbers, done) go printSquares(numbers, done) <-done // 等待 printNumbers Goroutine 完成 <-done // 等待 printSquares Goroutine 完成 }上記のコードでは、それぞれ数値を渡すために使用される 2 つのチャネル
numbers と
done を作成しました。 . そして完了信号。
printNumbers と
printSquares の 2 つの関数では、データ交換を実装し、Channel を介して Goroutine の実行順序を制御します。最後に、
<-done はメインスレッドをブロックし、2 つのゴルーチンの実行が完了するのを待ちます。
以上がGolang でのゴルーチンとチャネルのアプリケーション エクスペリエンスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。