シンプルで実用的: 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 サイトの他の関連記事を参照してください。