ホームページ  >  記事  >  バックエンド開発  >  golang 関数の同時実行制御のベスト プラクティスと原則

golang 関数の同時実行制御のベスト プラクティスと原則

PHPz
PHPzオリジナル
2024-04-24 10:12:01867ブラウズ

Go 言語関数の同時実行制御のベスト プラクティス: 同時実行を制限する: データ競合を避けるためにミューテックスまたはセマフォを使用します。チャネルの使用: チャネルを介して関数間の非同期通信を制御します。 goroutine グループを使用します。すべての goroutine が完了するまでリソースが解放されないようにします。例外処理: 予期しない終了を防ぐために例外を安全に処理します。実用的な例: goroutine グループとチャネルを使用して、同時実行性を制限し、例外を処理しながらデータベースに並列クエリを実行します。

golang 関数の同時実行制御のベスト プラクティスと原則

Go 言語関数同時実行制御のベスト プラクティスと原則

Go 言語では、関数同時実行制御は管理上重要です。同時実行機能は重要です。以下に、関数の同時実行を効果的に制御するのに役立ついくつかのベスト プラクティスと原則を示します。

同時実行を制限する

  • Mutex またはを使用します。 sync.RWMutex を使用して、共有リソースへの同時アクセスを制限し、データの競合を回避します。
  • Semaphore または RateLimiter を使用して同時関数の実行速度を調整し、システムの過負荷を防ぎます。

チャネルを使用する

    チャネルを使用して、関数間の同時実行性を制御します。チャネルは、関数が非同期通信できるようにするバッファリング メカニズムを提供します。
  • select ステートメントを使用して複数のチャネルを監視し、選択的な待機またはタイムアウト操作を実装します。

Goroutine グループを使用します

  • sync.WaitGroup または context.Context を使用して待機します。グループゴルーチンが完了しました。
  • すべてのゴルーチンが完了する前に、共有リソースが解放されたり、重要な操作が実行されたりしないようにしてください。
#例外処理

関数がパニックなどの例外を安全に処理できることを確認します。
  • エラー処理メカニズムを使用してエラーを返し、エラーを報告し、同時実行の予期しない終了を防ぎます。
実際のケース: データベースの同時クエリ

複数のデータベースを並行してクエリするシナリオを考えてみましょう。 Go 言語とベスト プラクティスを使用すると、これを効率的に実装できます。

package main

import (
    "context"
    "database/sql"
    "fmt"
    "sync"
)

func main() {
    db1 := connectToDB1()
    db2 := connectToDB2()

    var wg sync.WaitGroup
    resultCh := make(chan []string)

    wg.Add(2)
    go queryDB(db1, &wg, resultCh)
    go queryDB(db2, &wg, resultCh)

    go func() {
        // 等待 goroutine 完成并合并结果
        wg.Wait()
        close(resultCh)
    }()

    for results := range resultCh {
        fmt.Println(results)
    }
}

func queryDB(db *sql.DB, wg *sync.WaitGroup, resultCh chan<- []string) {
    defer wg.Done()
    rows, err := db.Query("SELECT * FROM table")
    if err != nil {
        log.Fatal(err)
    }
    var results []string
    for rows.Next() {
        var name string
        if err := rows.Scan(&name); err != nil {
            log.Fatal(err)
        }
        results = append(results, name)
    }
    rows.Close()
    resultCh <- results
}

このコードは、同時実行性を制限し例外を処理しながら、ゴルーチン グループとチャネルを使用してデータベースを並列クエリする方法を示しています。

以上がgolang 関数の同時実行制御のベスト プラクティスと原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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