Go中並發程式設計利用goroutine(輕量級執行緒)和channel(通訊管道)實現。 goroutine透過go關鍵字創建,非常輕量,可創建大量goroutine,且不會影響效能。 channel用於goroutine間通信,是類型化的管道。本例展示了併發爬蟲的應用,使用goroutine並行爬取URL,提高效率。
Go 核心技術解析:並發程式設計
Go 中的並發模型是基於goroutine(輕量級執行緒)和channel(通訊管道)的概念。透過充分利用這些特性,開發者可以建立高並發、高效能的應用程式。
Goroutine
Goroutine 是 Go 中的輕量級線程,由關鍵字 go
建立。它們在協程調度器上運行,與傳統線程不同,goroutine 非常輕量,可以創建數千個而不會對性能造成重大影響。以下程式碼展示如何建立和使用 goroutine:
package main import ( "fmt" "runtime" ) func main() { fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine()) // 当前正在运行的 goroutine 数量 // 创建一个 goroutine go func() { fmt.Println("Hello from a goroutine!") }() fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine()) // 当前正在运行的 goroutine 数量 }
Channel
#Channel 是用於 goroutine 之間通訊的管道。它們是類型化的,這意味著它們只能傳遞特定類型的值。以下程式碼展示如何建立和使用channel:
package main import ( "fmt" ) func main() { // 创建一个 int 类型的 channel c := make(chan int) // 向 channel 发送值 go func() { c <- 42 }() // 从 channel 接收值 v := <-c fmt.Println(v) // 输出:42 }
實戰案例:並發爬蟲
以下是使用goroutine 和channel 建立並發爬蟲的簡化範例:
package main import ( "fmt" "net/http" "sync" ) var wg sync.WaitGroup func main() { // 要爬取的 URL 列表 urls := []string{ "https://example.com", "https://example2.com", "https://example3.com", } // 创建 channel 来接收每个 URL 的响应 results := make(chan string) // 为每个 URL 创建一个 goroutine for _, url := range urls { wg.Add(1) go func(url string) { resp, err := http.Get(url) if err != nil { fmt.Printf("Error fetching %s: %v\n", url, err) } else if resp.StatusCode == 200 { results <- url } wg.Done() }(url) } // 从 channel 中获取响应 go func() { for url := range results { fmt.Println(url) } }() // 等待所有 goroutine 完成 wg.Wait() }
透過使用goroutine 和channel,此爬蟲可以並發爬取多個URL,從而提高了效率。
以上是Go語言核心技術解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!