ホームページ バックエンド開発 Golang Go WaitGroup とメッセージ キューの間のエレガントなコラボレーション

Go WaitGroup とメッセージ キューの間のエレガントなコラボレーション

Sep 27, 2023 pm 01:17 PM
go メッセージキュー waitgroup

Go WaitGroup与消息队列的优雅协作

Go WaitGroup とメッセージ キューの間の洗練されたコラボレーションには、特定のコード サンプルが必要です。

現代のソフトウェア開発では、同時プログラミングは避けられないトピックです。特に大規模なデータや大量の同時リクエストを扱う場合、同時操作を効果的に管理することが非常に重要です。

Go 言語は、強力な同時プログラミング言語として、開発者が効率的な同時操作を実現できるよう、豊富な同時実行プリミティブを提供します。中でも、WaitGroup とメッセージ キューは、非同期コラボレーション モードを実装するために広く使用されています。

WaitGroup は Go 言語標準ライブラリの重要な構造であり、ゴルーチンのグループの実行が完了するのを待つのに役立ちます。 WaitGroup は、複数のゴルーチンを開始し、次のステップに進む前に実行を終了させたい場合に非常に便利です。

ゴルーチンのグループが実行されるのを待つプロセスは、WaitGroup の 3 つのメソッドで実装できます。

  • Add(n int): n 個の待機中のゴルーチンを WaitGroup に追加します。
  • Done(): Done() メソッドは、各ゴルーチンの実行後に呼び出され、ゴルーチンが実行されたことを示します。
  • Wait(): メインの goroutine は、Wait() メソッドを呼び出して、待機しているすべての goroutine の実行が完了するのを待ちます。

以下は、WaitGroup を使用して複数のゴルーチンの実行が完了するのを待つ関数を実装する簡単なサンプル コードです。

package main

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

func main() {
    var wg sync.WaitGroup
    
    for i := 0; i < 5; i++ {
        wg.Add(1) // 启动5个goroutine,需要调用5次Add(1)
        go func(i int) {
            defer wg.Done() // 每个goroutine执行完毕后调用Done()
            fmt.Println("goroutine", i, "started")
            time.Sleep(time.Second)
            fmt.Println("goroutine", i, "finished")
        }(i)
    }

    wg.Wait() // 主goroutine等待所有goroutine执行完毕
    fmt.Println("all goroutines finished")
}
ログイン後にコピー

上記のコードでは、Add を通じてそれを伝えています。 WaitGroup のメソッド WaitGroup 待機するゴルーチンが 5 つあり、各ゴルーチンが実行された後に Done メソッドを呼び出します。最後に、メインのゴルーチンは Wait メソッドを呼び出して、すべてのゴルーチンが実行されるのを待ちます。

メッセージ キューは、一般的に使用されるもう 1 つの同時プログラミング パターンであり、非同期タスクを処理し、異なるコンポーネント間の通信を分離する場合に非常に便利です。メッセージ キューは、同時タスクのスケジューリングと分散を非常に適切に処理できるため、各タスクをオンデマンドで実行できます。

Go 言語では、チャネルを使用してメッセージ キュー機能を実装できます。以下は、チャネルを使用してメッセージ キューの機能を実装する簡単なコード例です。

package main

import "fmt"

func main() {
    tasks := make(chan int) // 创建一个整数类型的channel

    go func() {
        for i := 1; i <= 10; i++ {
            tasks <- i // 把任务发送到channel中
        }
        close(tasks) // 关闭channel,表示没有更多任务了
    }()

    for task := range tasks {
        fmt.Println("processing task", task)
        // 处理任务的逻辑...
    }

    fmt.Println("all tasks finished")
}
ログイン後にコピー

上記のコードでは、整数型のチャネルを作成し、それを別の goroutine 10 ミッションでチャネルに送信します。 。メインのゴルーチンは、ループを通じてチャネルからタスクを受け取り、タスクのロジックを処理します。

WaitGroup とメッセージ キューを組み合わせると、より複雑な同時プログラミング パターンを実現できます。たとえば、タスク スケジューリング システムでは、WaitGroup を使用してすべてのタスクが実行されるのを待機でき、各タスクはメッセージ キューを個別に使用して特定のサブタスクを処理できます。

以下は、WaitGroup とメッセージ キューを連携してタスク スケジューリングを行う方法を示すサンプル コードです。

package main

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

func main() {
    var wg sync.WaitGroup
    tasks := make(chan int) // 创建一个整数类型的channel

    wg.Add(1) // 增加1个等待的goroutine
    go func() {
        defer wg.Done() // 当前goroutine执行完毕后调用Done()

        for task := range tasks {
            fmt.Println("processing task", task)
            // 处理任务的逻辑...
            time.Sleep(time.Second)
        }
    }()

    for i := 1; i <= 10; i++ {
        tasks <- i // 把任务发送到channel中
    }
    close(tasks) // 关闭channel,表示没有更多任务了

    wg.Wait() // 等待所有任务执行完毕

    fmt.Println("all tasks finished")
}
ログイン後にコピー

上記のコードでは、タスクを受信するための整数型のチャネルを作成します。次に、ゴルーチンが開始され、タスクがチャネルから受信されて処理されます。メインのゴルーチンは、チャネルにタスクを送信し、すべてのタスクが実行された後に待機する責任があります。

WaitGroup とメッセージ キューの洗練された連携により、効率的な同時プログラミングを実現できます。 WaitGroup は、同時操作の実行順序を制御し、すべてのタスクが完了するのを待つのに役立ちます。メッセージキューは、タスクの動的なスケジューリングや分散、タスクの非同期処理を実現します。この 2 つを組み合わせることで、より多くの同時プログラミングのアイデアとツールが提供され、複雑な同時操作をより適切に実装できるようになります。

要約すると、Go WaitGroup とメッセージ キューの間の洗練されたコラボレーションは、同時プログラミングにおいて重要な役割を果たします。これらを適切に使用すると、効率的で信頼性の高い同時操作を実現できます。大規模なデータを扱う場合でも、同時リクエストの数が多い場合でも、これは非常に便利な同時プログラミング モデルです。

以上がGo WaitGroup とメッセージ キューの間のエレガントなコラボレーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Go で正規表現を使用してタイムスタンプを照合するにはどうすればよいですか? Go で正規表現を使用してタイムスタンプを照合するにはどうすればよいですか? Jun 02, 2024 am 09:00 AM

Go では、正規表現を使用してタイムスタンプを照合できます。ISO8601 タイムスタンプの照合に使用されるような正規表現文字列をコンパイルします。 ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ 。 regexp.MatchString 関数を使用して、文字列が正規表現と一致するかどうかを確認します。

Go WebSocket メッセージを送信するにはどうすればよいですか? Go WebSocket メッセージを送信するにはどうすればよいですか? Jun 03, 2024 pm 04:53 PM

Go では、gorilla/websocket パッケージを使用して WebSocket メッセージを送信できます。具体的な手順: WebSocket 接続を確立します。テキスト メッセージを送信します。 WriteMessage(websocket.TextMessage,[]byte("message")) を呼び出します。バイナリ メッセージを送信します。WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}) を呼び出します。

GolangとGo言語の違い GolangとGo言語の違い May 31, 2024 pm 08:10 PM

Go と Go 言語は、異なる特性を持つ別個の存在です。 Go (Golang とも呼ばれます) は、同時実行性、高速なコンパイル速度、メモリ管理、およびクロスプラットフォームの利点で知られています。 Go 言語の欠点としては、他の言語に比べてエコシステムが充実していないこと、構文が厳格であること、動的型付けが欠如していることが挙げられます。

Golang の技術的なパフォーマンスの最適化でメモリ リークを回避するにはどうすればよいですか? Golang の技術的なパフォーマンスの最適化でメモリ リークを回避するにはどうすればよいですか? Jun 04, 2024 pm 12:27 PM

メモリ リークは、ファイル、ネットワーク接続、データベース接続などの使用されなくなったリソースを閉じることによって、Go プログラムのメモリを継続的に増加させる可能性があります。弱参照を使用してメモリ リークを防ぎ、強参照されなくなったオブジェクトをガベージ コレクションの対象にします。 go coroutine を使用すると、メモリ リークを避けるために、終了時にコルーチンのスタック メモリが自動的に解放されます。

Golang のエラー ラッパーを使用するにはどうすればよいですか? Golang のエラー ラッパーを使用するにはどうすればよいですか? Jun 03, 2024 pm 04:08 PM

Golang では、エラー ラッパーを使用して、元のエラーにコンテキスト情報を追加することで新しいエラーを作成できます。これを使用すると、さまざまなライブラリまたはコンポーネントによってスローされるエラーの種類を統一し、デバッグとエラー処理を簡素化できます。手順は次のとおりです。errors.Wrap 関数を使用して、元のエラーを新しいエラーにラップします。新しいエラーには、元のエラーのコンテキスト情報が含まれています。 fmt.Printf を使用してラップされたエラーを出力し、より多くのコンテキストとアクション性を提供します。異なる種類のエラーを処理する場合は、errors.Wrap 関数を使用してエラーの種類を統一します。

Go 同時関数の単体テストのガイド Go 同時関数の単体テストのガイド May 03, 2024 am 10:54 AM

並行関数の単体テストは、同時環境での正しい動作を確認するのに役立つため、非常に重要です。同時実行機能をテストするときは、相互排他、同期、分離などの基本原則を考慮する必要があります。並行機能は、シミュレーション、競合状態のテスト、および結果の検証によって単体テストできます。

Go で優先順位付きのゴルーチンを作成するにはどうすればよいですか? Go で優先順位付きのゴルーチンを作成するにはどうすればよいですか? Jun 04, 2024 pm 12:41 PM

Go 言語で優先度のゴルーチンを作成するには、カスタム ゴルーチン作成関数の登録 (ステップ 1) と優先度の値の指定 (ステップ 2) の 2 つの手順があります。このようにして、異なる優先度を持つゴルーチンを作成し、リソース割り当てを最適化し、実行効率を向上させることができます。

Golang関数がマップパラメータを受け取る際の注意点 Golang関数がマップパラメータを受け取る際の注意点 Jun 04, 2024 am 10:31 AM

Go の関数にマップを渡すと、デフォルトでコピーが作成され、コピーへの変更は元のマップには影響しません。元のマップを変更する必要がある場合は、ポインタを介してそれを渡すことができます。空のマップは技術的には nil ポインターであり、空ではないマップを期待する関数に空のマップを渡すとエラーが発生するため、空のマップは慎重に扱う必要があります。

See all articles