マップ内の値が Go で使用可能になるまで待ちます
Feb 05, 2024 pm 09:51 PM基本的に 3 つのことを行うプログラムがあります。キーの値を設定する、値が存在する場合は値を取得する、または待機するまで待機します。指定されたキーの値が利用可能です。私の最初のアイデアは、map[string]interface{}
を使用して新しい型を作成し、そこに「永続的な」値を保存するというものです。それ以外は、値を待つために map[string](chan struct{})
を使用する予定です。 set()
メソッドが呼び出されたら、チャネルに書き込みます。チャネルを待っている人は、値がそこにあることがわかります。
キーは事前にわかりません。キーはランダムです。 wait()
メソッドを正しく実装する方法がわかりません。
問題は、wait()
で競合状態が発生していることです。ミューテックスを解放した後、チャネルで受信値のリッスンを開始する前です。
この問題に対処する最善の方法は何ですか?これを達成する方法に関する他の提案は大歓迎です。これを行うためのより良い方法があるはずです。一定の間隔などで値をポーリングしているわけではありません。
正解
あなたが探しているのは、同期マップとメッセージ ブローカーのハイブリッドです。これは、通信および同期チャネルを活用することで実現でき、メッセージが公開されるとすぐにサブスクライバーがメッセージを受信できるようになります (まだキャッシュにない場合)。
リーリー サブスクライバは待機中にマップ ミューテックスのロックを解除する必要があるため、マップに追加された新しいメッセージに安全にアクセスできません。新しい値は独自のチャネルを介してすべての加入者に直接送信されるため、マップ自体のロックを解除する前にすべての加入者が満足していることを確認するために set
に同期を追加する必要がありません。マップを早期にロック解除すると、サブスクライバーはマップを直接読み取ることができますが、同時に新しい値が挿入されることも可能になり、結果が一貫性がなくなります。
実行バージョンには、型パラメータを備えた汎用の map
実装も含まれています: https://go.dev /play/p/an7vrspdgmo
以上がマップ内の値が Go で使用可能になるまで待ちますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?
