ホームページ >バックエンド開発 >Golang >シンプルかつ実践的: Go WaitGroup の応用例を共有

シンプルかつ実践的: Go WaitGroup の応用例を共有

王林
王林オリジナル
2023-09-28 08:23:14594ブラウズ

简单实用:Go WaitGroup的应用实例分享

シンプルで実用的: Go WaitGroup アプリケーション例の共有

はじめに:
Go 言語は、同時処理のための多くの組み込みツールと機能を備えた同時プログラミング言語です。 . .そのうちの 1 つは sync.WaitGroup で、これは同時タスクのグループの完了を待つための洗練された簡単な方法を提供します。この記事では、特定のアプリケーション例を共有し、WaitGroup を使用して同時タスクの実行を高速化する方法を示します。

待機グループとは何ですか?
sync.WaitGroup は Go 言語標準ライブラリの構造体で、同時タスクのグループの完了を待つために使用されます。内部的にカウンタを維持し、カウンタ値を増減できます。カウンタの値が 0 になると、すべてのタスクが完了したことを意味し、WaitGroup 内のブロック操作が解除されます。

アプリケーション例:
複数の Web ページからデータをクロールし、同時にデータ取得を高速化する必要があるとします。 WaitGroup を使用して、これらのクローラー タスクを同時に実行できます。サンプル コードは次のとおりです。

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "sync"
)

func crawl(url string, wg *sync.WaitGroup) {
    defer wg.Done()

    resp, err := http.Get(url)
    if err != nil {
        fmt.Printf("发生错误:%s
", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("发生错误:%s
", err)
        return
    }

    fmt.Printf("爬取完成:%s
", url)
    // TODO: 处理网页内容
}

func main() {
    urls := []string{
        "https://www.example.com",
        "https://www.google.com",
        "https://www.microsoft.com",
    }

    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        go crawl(url, &wg)
    }

    wg.Wait()
    fmt.Println("所有任务已完成")
}

上記のコードでは、単一のクローラー タスクを実行する crawl 関数を定義します。 crawl 関数は、URL と WaitGroup ポインターをパラメーターとして受け取ります。関数内では、http.Get を使用して HTTP リクエストを送信し、応答の内容を読み取ります。タスクが完了したら、wg.Done() を呼び出して WaitGroup カウンターをデクリメントします。

main 関数では、URL リストを定義し、WaitGroup を使用して各 URL に対応するクローラー タスクを処理します。 URL リストを走査するとき、wg.Add(1) を使用して WaitGroup のカウンターをインクリメントし、go キーワードを使用して新しい goroutine を作成します。同時実行でタスクを実行します。

最後に、wg.Wait() を呼び出して、すべてのタスクの完了を待ちます。すべてのタスクが完了すると、プログラムは次のコードの実行を続けます。

概要:
このアプリケーション例を通じて、同時プログラミングにおける sync.WaitGroup の役割について説明しました。同時タスクを調整および制御するプロセスが簡素化され、同時プログラミングがシンプルで理解しやすくなります。同時に、同時タスクの安全性を確保するには、共有リソースに適切な相互排他保護を提供する必要があることにも注意する必要があります。

上記の例が読者の理解を深め、sync.WaitGroup を使用して同時タスクの実行を高速化するのに役立つことを願っています。

以上がシンプルかつ実践的: Go WaitGroup の応用例を共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。