首頁  >  文章  >  後端開發  >  golang函數的goroutine

golang函數的goroutine

王林
王林原創
2024-04-19 17:39:02796瀏覽

Goroutine 是 Go 中並行執行任務的輕量級執行線程,透過 go 關鍵字創建,具有並發性、輕量級和通訊能力。在實戰案例中,同時爬蟲利用 Goroutine 並行抓取 URL,並使用頻道限制並發 goroutine 數量,以優化效能和系統資源。

golang函數的goroutine

Go 函數中的 Goroutine

#Goroutine 是 Go 中輕量級執行線程,可以並行執行。它們讓我們能夠編寫並發和高效的程式碼。

建立Goroutine

使用go 關鍵字建立一個Goroutine,後面跟著一個函數呼叫:

func main() {
    go hello()
}

func hello() {
    fmt.Println("Hello world!")
}

#goroutine的好處

  • 並發性: Goroutine 可以同時執行多個任務,從而提高效能。
  • 輕量: Goroutine 比執行緒輕得多,開銷也更低。
  • 通訊: Goroutine 可以透過通道(channels)輕鬆地通訊。

實戰案例:並發爬蟲

使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn