golang関数のゴルーチン

王林
リリース: 2024-04-19 17:39:02
オリジナル
820 人が閲覧しました

Goroutine は Go でタスクを並列実行する軽量の実行スレッドで、go キーワードによって作成され、同時実行性、軽量性、通信機能を備えています。実際のケースでは、同時クローラーは Goroutine を使用して URL を並行してクロールし、チャネルを使用して同時 Goroutine の数を制限し、パフォーマンスとシステム リソースを最適化します。

golang関数のゴルーチン

Go 関数の Goroutine

Goroutine は Go の軽量実行スレッドであり、並列実行できます。これらにより、同時かつ効率的なコードを作成できるようになります。

Goroutine の作成

go キーワードに続いて関数呼び出しを使用して、Goroutine を作成します:

func main() {
    go hello()
}

func hello() {
    fmt.Println("Hello world!")
}
ログイン後にコピー

goroutine の利点

  • # 同時実行性: Goroutine は複数のタスクを同時に実行できるため、パフォーマンスが向上します。
  • 軽量: Goroutine はスレッドよりもはるかに軽く、オーバーヘッドが低くなります。
  • 通信: 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 この関数は、チャネル (sem) を使用して URL を並行してクロールし、同時に実行するゴルーチンを最大 3 つまで制限します。これは、パフォーマンスとシステム リソースのバランスを取るのに役立ちます。

以上がgolang関数のゴルーチンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート