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