Golang 協程是一種並發執行機制,透過 goroutine 關鍵字創建,用於類別 Unix 系統程式設計。它透過通道實現協程間通信,在實戰中可用於並發 Web 伺服器,提高效能和可擴展性。
協程是一種輕量級並發執行機制,它可以大幅提高應用程式的效能,尤其是在處理高並發、IO密集型任務時。 Golang 語言提供了強大的協程支持,使其成為類 Unix 系統程式設計的理想選擇。
在Golang 中,可以使用goroutine
關鍵字建立協程:
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中文網其他相關文章!