Go 言語関数の同時実行制御のベスト プラクティス: 同時実行を制限する: データ競合を避けるためにミューテックスまたはセマフォを使用します。チャネルの使用: チャネルを介して関数間の非同期通信を制御します。 goroutine グループを使用します。すべての goroutine が完了するまでリソースが解放されないようにします。例外処理: 予期しない終了を防ぐために例外を安全に処理します。実用的な例: goroutine グループとチャネルを使用して、同時実行性を制限し、例外を処理しながらデータベースに並列クエリを実行します。
Go 言語関数同時実行制御のベスト プラクティスと原則
Go 言語では、関数同時実行制御は管理上重要です。同時実行機能は重要です。以下に、関数の同時実行を効果的に制御するのに役立ついくつかのベスト プラクティスと原則を示します。
同時実行を制限する
またはを使用します。
sync.RWMutex を使用して、共有リソースへの同時アクセスを制限し、データの競合を回避します。
または
RateLimiter を使用して同時関数の実行速度を調整し、システムの過負荷を防ぎます。
チャネルを使用する
ステートメントを使用して複数のチャネルを監視し、選択的な待機またはタイムアウト操作を実装します。
Goroutine グループを使用します
または
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 サイトの他の関連記事を参照してください。