Goroutine 是 Go 中並行執行任務的輕量級執行線程,透過 go 關鍵字創建,具有並發性、輕量級和通訊能力。在實戰案例中,同時爬蟲利用 Goroutine 並行抓取 URL,並使用頻道限制並發 goroutine 數量,以優化效能和系統資源。
Go 函數中的 Goroutine
#Goroutine 是 Go 中輕量級執行線程,可以並行執行。它們讓我們能夠編寫並發和高效的程式碼。
建立Goroutine
使用go
關鍵字建立一個Goroutine,後面跟著一個函數呼叫:
func main() { go hello() } func hello() { fmt.Println("Hello world!") }
#goroutine的好處
實戰案例:並發爬蟲
使用Goroutine 建立一個並發爬蟲:
package main import ( "fmt" "sync" "time" ) // URL 队列 var urls = []string{"url1", "url2", "url3"} // 用于确保并发安全 var wg sync.WaitGroup // 抓取函数 func fetch(url string) { // 模拟抓取 fmt.Println("抓取", url) time.Sleep(100 * time.Millisecond) wg.Done() } func main() { // 限制并发 goroutine 的数量 maxConcurrency := 3 // 创建一个信道来限制并发 goroutine 的数量 sem := make(chan struct{}, maxConcurrency) // 为每个 URL 创建一个 goroutine for _, url := range urls { sem <- struct{}{} wg.Add(1) go func(url string) { defer wg.Done() defer func() { <-sem }() fetch(url) }(url) } // 等待所有 goroutine 完成 wg.Wait() }
在這個範例中,fetch
函數並行抓取URL,使用頻道(sem
) 限制最多3 個goroutine 同時運行。這有助於平衡效能和系統資源。
以上是golang函數的goroutine的詳細內容。更多資訊請關注PHP中文網其他相關文章!