前回の例では、複数のゴルーチンから共有状態への アクセスを同期するために、ミューテックス による明示的なロックを使いました。 同じ結果を得るために、ゴルーチンとチャネルがもつ 組み込みの同期機能を使う方法もあります。 チャネルベースのアプローチは、通信によってメモリを共有し、 各データは 1 つのゴルーチンによって所有されるべきという、 Go の考え方に沿っています。 |
|
|
|
|
|
この例では、状態は 1 つのゴルーチンに所有させます。
これは、データが並行アクセスで決して壊れないことを保証します。
ほかのゴルーチンが状態を読み書きするためには、
データを所有するゴルーチンにメッセージを送り、
対応するデータを受け取る必要があります。
|
|
|
|
前回と同様に、操作回数をカウントします。 |
|
|
|
これは前回の例と同様にマップ |
|
ここで、状態をもつゴルーチンから |
|
同様に、書き込み用のゴルーチンを 10 個開始します。 |
|
ゴルーチンを 1 秒間動作させます。 |
|
最後に、操作回数を取得してレポートします。 |
|
プログラムを実行すると、ゴルーチンベースの状態管理で 80,000 回程の操作を完了したことが分かります。 |
|
今回の例では、ミューテックスベースと比べてゴルーチンベースの アプローチはやや複雑でした。 しかし、他の関連するチャネルがある場合などは、 複数のミューテックスを管理するのは間違えやすいので、 こちらのアプローチが有用です。 いずれにせよ、正しいプログラムを作るのに最も適切だと 思えるアプローチを使うべきです。 |
Next example: Sorting.