Golang コルーチンは、 goroutine キーワードによって作成され、Unix のようなシステム プログラミングに使用される同時実行メカニズムです。チャネルを介したコルーチン間通信を実装し、同時 Web サーバーで使用して実際のパフォーマンスとスケーラビリティを向上させることができます。
コルーチンは、アプリケーションのパフォーマンスを大幅に向上させる軽量の同時実行メカニズムです。特に、同時実行性が高く、IO 集中型のタスクを処理する場合に重要です。 Golang 言語は強力なコルーチン サポートを提供するため、Unix のようなシステムのプログラミングに最適です。
Golang では、groutin
キーワードを使用してコルーチンを作成できます。
package main import ( "fmt" "runtime" ) func main() { go func() { fmt.Println("这是另一个协程!") }() runtime.Gosched() // 主动让出 CPU 给其他协程 }
上記のコードは、コルーチンを作成します。コルーチンは main
関数の外で実行され、メッセージを出力します。 runtime.Gosched()
この関数は CPU リソースを積極的に解放し、他のコルーチンの実行を許可します。
チャネルは、Golang のコルーチン間の通信に使用されるメカニズムです。これらはタイプ セーフでノンブロッキングの通信方式です:
package main import ( "fmt" "time" ) func main() { // 创建一个有缓冲的通道,存放整数 ch := make(chan int, 10) // 在一个协程中向通道发送数据 go func() { for i := 0; i < 10; i++ { ch <- i time.Sleep(100 * time.Millisecond) // 延迟发送数据 } close(ch) // 关闭通道,表示不再发送数据 }() // 在另一个协程中从通道读取数据 go func() { for { v, ok := <-ch if !ok { break // 通道已关闭 } fmt.Println(v) } }() time.Sleep(1100 * time.Millisecond) // 等待协程执行完毕 }
クライアント要求を処理するための同時 Web サーバーの例を考えてみましょう:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!\n") }) // 使用 Goroutine 同时监听多个端口 go http.ListenAndServe(":8080", nil) go http.ListenAndServe(":8081", nil) select {} // 阻塞主协程,保持服务器运行 }
コルーチンを使用することにより、このサーバーは複数のポート上のリクエストを同時に処理できるため、スケーラビリティとパフォーマンスが向上します。
以上がGolang コルーチンと Unix 風のシステム プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。