自動 API ドキュメント生成ツールである LiveAPI の開発中に、サーバー マシンのコアの数に基づいて拡張できる堅牢なキュー メカニズムを実装する必要がありました。これは、リソース枯渇、クラッシュ、ユーザー エクスペリエンスの低下につながる可能性のある過剰なリソース使用 (メモリと CPU) を防ぐために非常に重要でした。
この記事では、この課題に対処するために Golang でミューテックスをどのように利用したかについて説明します。
ミューテックスとは何ですか?
同時プログラミングでは、Mutex (相互排他) は、一度に 1 つの goroutine だけが共有リソースにアクセスできるようにすることで競合状態を防ぐロック メカニズムです。 これは部屋の鍵に似ています。一度に 1 人だけが鍵を持って入ることができます。
Golang でのミューテックスの使用法
Mutex がジョブの同時実行をどのように管理できるかを説明してみましょう:
Go の sync パッケージは同期用のプリミティブをいくつか提供しており、Mutex は最も一般的に使用されるツールの 1 つです。
var ( maxConcurrentJobs int activeJobs int jobMutex sync.Mutex )
このコードでは、activeJobs 変数が現在実行中のジョブの数を追跡します。複数のゴルーチンがこの変数を同時に変更しようとして競合状態が発生する可能性があるため、ミューテックスを使用してアクセスを同期します。
// Check if we can process more jobs jobMutex.Lock() if activeJobs >= maxConcurrentJobs { jobMutex.Unlock() // Wait before checking again time.Sleep(time.Second) continue } jobMutex.Unlock()
ミューテックスの仕組み
ロック: Lock() メソッドは、クリティカル セクションへの排他的アクセスを取得します。
ロック解除: Unlock() メソッドはロックを解放します。
クリティカル セクション: **共有リソースにアクセスするロックとロック解除の間のコード。
Golang のミューテックスの種類
sync.Mutex: これは Go の基本的な相互排他ロックです。一度に 1 つの goroutine だけがクリティカル セクションにアクセスできます。
type SafeCounter struct { mu sync.Mutex count int }
sync.RWMutex: これは、複数のリーダーが共有リソースに同時にアクセスできるようにするリーダー/ライターのミューテックスですが、一度に 1 つのライターのみにアクセスできます。
var rwMutex sync.RWMutex // Reader methods rwMutex.RLock() // Lock for reading rwMutex.RUnlock() // Unlock for reading // Writer methods rwMutex.Lock() // Lock for writing rwMutex.Unlock() // Unlock for writing
ミューテックスは、同時実行 Go プログラムで共有リソースを管理するために不可欠なツールです。コードの重要なセクションへのアクセスを制御することで、競合状態を防止し、データの整合性を確保します。
以上がMutex とは何ですか? Golang での使用方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。