ホームページ バックエンド開発 Golang 効率的な同時プログラミングの実践: Golang での Go WaitGroup の使用に関するヒント

効率的な同時プログラミングの実践: Golang での Go WaitGroup の使用に関するヒント

Sep 28, 2023 pm 07:12 PM
言語を移動 waitgroup 効率的な同時プログラミング

高效并发编程实践:Golang中的Go WaitGroup使用技巧

効率的な並行プログラミングの実践: Golang での Go WaitGroup 使用のヒント

はじめに: 並行プログラミングは、今日のソフトウェア開発分野において重要な部分です。大規模システムでは、効率的な同時処理により、システムのパフォーマンスとスループットが大幅に向上します。 Golang は同時実行性を重視した言語として、豊富な同時プログラミング ツールと機能を提供します。そのうちの 1 つは WaitGroup です。この記事では、Golang での WaitGroup の使用スキルを紹介し、具体的なコード例を示します。

1. WaitGroup とは何ですか?
WaitGroup は Golang の同時同期プリミティブで、ゴルーチンのグループの完了を待つために使用されます。通常、メインの goroutine で WaitGroup の Add メソッドを使用して待機する goroutine の数を設定し、次に Wait メソッドを使用してすべての goroutine が完了するのを待ちます。

2. WaitGroup の基本的な使用法
以下は WaitGroup の基本的な使用例です:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    // 设置需要等待的goroutine数
    wg.Add(2)

    // 启动goroutine
    go printMessage("Hello", &wg)
    go printMessage("World", &wg)

    // 等待所有goroutine完成
    wg.Wait()

    fmt.Println("All goroutines finished.")
}

func printMessage(message string, wg *sync.WaitGroup) {
    // 在函数结束时通知WaitGroup当前goroutine已经完成
    defer wg.Done()

    fmt.Println(message)
    time.Sleep(time.Second)
}

上の例では、WaitGroup オブジェクト wg を作成し、Add メソッドを使用して次のことを示しました。待機中のゴルーチンの数は 2 です。次に、printMessage 関数を実行する 2 つのゴルーチンを開始し、各ゴルーチンは 1 秒後にメッセージを出力します。 printMessage 関数では、defer wg.Done() を使用して、現在の goroutine が完了したことを WaitGroup に通知します。最後に、wg.Wait() を使用して、すべてのゴルーチンが完了するのを待ちます。

3. WaitGroup の共通スキル
基本的な使用法に加えて、WaitGroup を他の機能と組み合わせて使用​​して、他の効率的な同時プログラミング手法を実現することもできます。一般的な手法をいくつか示します。

  1. 同時処理に匿名関数を使用する
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    names := []string{"Alice", "Bob", "Charlie"}

    // 设置需要等待的goroutine数
    wg.Add(len(names))

    for _, name := range names {
        go func(n string) {
            // 在函数结束时通知WaitGroup当前goroutine已经完成
            defer wg.Done()

            fmt.Println("Hello,", n)
        }(name)
    }

    // 等待所有goroutine完成
    wg.Wait()

    fmt.Println("All goroutines finished.")
}

上の例では、名前のリストを並行処理するために、匿名関数と組み合わせた WaitGroup を使用しています。 。ループ内で匿名関数を使用することで、ゴルーチンを特定の操作に結び付けることができ、競合状態の可能性を回避できます。

  1. 特定の数のゴルーチンが完了するまで待機します
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    // 设置需要等待的goroutine数
    wg.Add(3)

    go printMessage("Hello", &wg)
    go printMessage("World", &wg)

    // 在前两个goroutine完成之后,继续启动一个goroutine
    go func() {
        printMessage("Golang", &wg)
        wg.Done()
    }()

    // 等待所有goroutine完成
    wg.Wait()

    fmt.Println("All goroutines finished.")
}

func printMessage(message string, wg *sync.WaitGroup) {
    defer wg.Done()

    fmt.Println(message)
}

上の例では、待機するゴルーチンの数を 3 に設定し、最初の 2 つのゴルーチンが終了した後、完了すると、3 番目のゴルーチンが開始されます。これにより、最初の 2 つのゴルーチンが 3 番目のゴルーチンを開始する前に完了することが保証されます。

4. 概要
この記事では、Golang での WaitGroup の基本的な使用法を紹介し、いくつかの一般的なテクニックを提供します。 WaitGroup を適切に使用することで、効率的な同時プログラミングを簡単に実装できます。実際の開発では、特定の問題やシナリオに応じて WaitGroup を柔軟に使用し、他の同時実行プリミティブと組み合わせて、システムのパフォーマンスと同時実行処理能力を向上させる必要があります。

この記事の学習を通じて、読者が WaitGroup の使用スキルを習得し、実際のプロジェクトで並行プログラミングを合理的に使用できるようになり、それによってシステムのパフォーマンスと信頼性が向上することを願っています。

以上が効率的な同時プログラミングの実践: Golang での Go WaitGroup の使用に関するヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GOプログラミングでは、MySQLとRedisの間で接続を正しく管理し、リソースをリリースする方法は? GOプログラミングでは、MySQLとRedisの間で接続を正しく管理し、リソースをリリースする方法は? Apr 02, 2025 pm 05:03 PM

GOプログラミングのリソース管理:MySQLとRedisは、特にデータベースとキャッシュを使用して、リソースを正しく管理する方法を学習するために接続およびリリースします...

Centos postgreSqlリソース監視 Centos postgreSqlリソース監視 Apr 14, 2025 pm 05:57 PM

PostgreSQLデータベースリソース監視スキームの詳細な説明CENTOSシステムこの記事では、CENTOSシステム上のPostgreSQLデータベースリソースを監視するさまざまな方法を紹介し、潜在的なパフォーマンスの問題をタイムリーに発見および解決するのに役立ちます。 1. POSTGRESQLビルトインツールとビューを使用するPostgreSQLには、パフォーマンスとステータスの監視に直接使用できます。 PG_STAT_STATEMENTS:SQLステートメント統計を収集し、クエリパフォーマンスボトルネックを分析します。 PG_STAT_DATABASE:トランザクションカウント、キャッシュヒットなどのデータベースレベルの統計を提供します

他の言語と他の言語:比較分析 他の言語と他の言語:比較分析 Apr 28, 2025 am 12:17 AM

goisastrongchoiceforprojectsingingingimplicity、andconcurrency、butmaylackinadvencedecosystemmaturity.1)

goのinit関数の一般的なユースケース goのinit関数の一般的なユースケース Apr 28, 2025 am 12:13 AM

fortheInit functioningoareの場合:1)configurationfilesbemainprogramstarts、2)初期化Globalvariables、および3)running-checksSorvalidationseforetheprogramprocutess.theinitistomationaledemainforeThemainfunction、Makin

同じパッケージ内のさまざまなファイルで、LowercaseNamed関数を使用する方法は? 同じパッケージ内のさまざまなファイルで、LowercaseNamed関数を使用する方法は? Apr 02, 2025 pm 05:00 PM

同じパッケージ内の異なるファイルで小文字名を使用する方法は?ゴーに...

See all articles