ホームページ  >  記事  >  バックエンド開発  >  golang でのスライスによる同時マッピング

golang でのスライスによる同時マッピング

WBOY
WBOY転載
2024-02-11 09:57:091136ブラウズ

golang 中带有切片的并发映射

php エディター Banana が、golang でのスライスの同時マッピングに関する素晴らしい記事を提供してくれました。この記事では、同時環境でのマッピング操作にスライスを使用する方法を説明し、スライスが同時プログラミングで非常に役立つ理由を説明します。 golang の同時実行メカニズムを使用すると、複数の goroutine のスライスに同時にアクセスして変更できるため、プログラムのパフォーマンスと効率が向上します。初心者でも経験豊富な Golang 開発者でも、この記事は貴重な知識と実践的なスキルを提供します。 Golang でスライスを使用した同時マッピングを調べてみましょう。

質問の内容

現場の開発者の一人が数か月前に退職して以来、同時実行性の問題を解決しようとしていますが、これを解決する適切な方法が見つかりません。問題。

コンテキストのために、顧客データを次のような構造にロードします:

[ キー ] -> { 値 }

[顧客固有のハッシュ] -> {データ ポイント/ファイル スライス}

例 - 書式が非常に悪いです、申し訳ありません:

リーリー

上記の理由は、当社には 100,000 人の顧客がおり、毎晩、各顧客のハッシュ (実際にはバケット) に基づいてデータを統合するプロセスを開始しているためです。データフレームを処理する前に、スライスを反復処理し、データフレームを多くの法律/会計ルールを含む 1 つの大きなデータフレームに「マージ」します。

これは goroutine で実行され、すべてのデータ ポイントにできるだけ早くインデックスを付けます。

つまり、実装は本質的に sync.Map[string, []DataFrame] です。しかし、マップ操作は保護されていますが、DataFrame スライスへの追加は保護されていないことに気付きました。各ハッシュには、おそらく 1 晩あたり約 20 ~ 30 のファイル参照がそのスライスに含まれています。

過去 2 年間に顧客データが誤ってマージされた可能性が高く、私はそれを修正する任務を負っています。 sync.map を使用する前は、Map で RWMutex を再度使用していましたが、スライスは使用していませんでした。この記事がガイドとして示されています。

まず第一に、スライスを含む Map という考え方は適切なデータ構造ですか?

RWMutex ベースのタイル ハンドラーを作成しようとしていますが、顧客ファイルのインデックス作成時にマップに chan DataFrame を代わりに追加し、完了したら 2 番目のステップでそれらをマージできるかどうか疑問に思っていました。配列 (len(chanx) など) はわかりますか?

私は主に Java 出身なので、用語が混同されているかもしれません。ごめんなさい。

解決策

2つの異なる問題があります:

  1. マップの更新時に同時実行の問題が発生しました
  2. マップエントリ更新時の同時実行性の問題

sync.Map は 1 を防ぎますが、2 は防ぎません。

この問題を解決する 1 つの方法は次のとおりです:

リーリー ###どこ### リーリー

マップからエントリを取得したら、

Lock

または RLock してからデータを使用する必要があります。これはスライスの追加だけに限定されません。データフレームから読み取るだけの場合でも、構造を ##RLock する必要があります。 新しいデータフレームを追加する場合: リーリー

以上がgolang でのスライスによる同時マッピングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。