首頁  >  文章  >  後端開發  >  golang 中帶有切片的並發映射

golang 中帶有切片的並發映射

WBOY
WBOY轉載
2024-02-11 09:57:091098瀏覽

golang 中带有切片的并发映射

php小編香蕉帶來了一篇精彩的文章,講述了golang中切片的並發映射。在這篇文章中,我們將了解如何在並發環境中使用切片進行映射操作,並解釋了為什麼切片在並發編程中非常有用。透過使用golang的並發機制,我們可以在多個goroutine中同時存取和修改切片,從而提高程式的效能和效率。無論你是初學者還是有經驗的golang開發者,這篇文章都將為你帶來有價值的知識和實踐技巧。讓我們一起來探索golang中帶有切片的並發映射吧!

問題內容

在該領域的一位開發人員幾個月前離開後,我一直在嘗試解決並發問題,但我找不到解決此問題的適當方法。

對於上下文,我們將客戶資料載入到如下結構中:

[ 鍵 ] -> { 值 }

#[客戶特定雜湊] -> {資料點/檔案切片}

範例 - 格式確實很糟糕,抱歉:

[a60d849ad97bfb833e1096941] 
-> 
{ 
 { StartDate: '01-02-2022', EndDate: '28-02-2022', DataFrames: [1598,921578,12981,21749,192578...]},
 { StartDate: '01-03-2022', EndDate: '28-03-2022', DataFrames: [1234,1567,6781,126978...]},
}

以上是因為我們有 100,000 名客戶,並且每天晚上都會啟動一個流程,根據每個客戶的雜湊值(或實際上是一個儲存桶)來整合資料。在處理資料幀之前,我們會遍歷切片並將資料幀「合併」成一個大的資料幀,其中包含許多法律/會計規則。

它在 goroutine 中運行,以盡快索引所有資料點。

所以實作本質上是一個 sync.Map[string, []DataFrame] 但我注意到雖然映射操作受到保護,但附加到資料幀切片卻不受保護。每個雜湊值每晚在該切片中可能有大約 20-30 個檔案引用。

在過去的兩年裡,客戶資料很有可能被錯誤地合併,我的任務是修復它。在sync.map之前,他們再次使用了帶有Map的RWMutex,但不是切片,它指向本文作為指南。

首先,包含切片的 Map 的想法是適當的資料結構嗎?

我嘗試建立一個基於RWMutex 的切片處理程序,但想知道Map 是否可以有一個chan DataFrame 來代替在索引客戶檔案時放入,然後一旦完成,第二步將其合併到一個陣列中(如len(chanx)) 會被知道嗎?

我主要來自 Java,所以我可能對一些術語感到困惑,所以我很抱歉。

解決方法

您有兩個不同的問題:

  1. 更新地圖時出現並發問題
  2. 更新地圖條目時出現並發問題

sync.Map 將防止 1,但無法防止 2。

解決這個問題的一種方法是:

sync.Map[string, *DFrame]

哪裡

type DFrame struct {
  sync.RWMutex 
  Data []DataFrame
}

一旦從地圖中獲取條目,您應該 LockRLock 它,然後使用資料。這不僅限於切片的附加。即使您只從資料幀中讀取,您也必須 RLock 該結構。

因此,如果您要附加新的資料框:

df := &DFrame{}
entry,_:=m.LoadOrStore(key, df)
dfEntry:=entry.(*DFrame)
dfEntry.Lock()
dfEntry.Data=append(dfEntry.Data, newDataFrame)
dfEntry.Unlock()

以上是golang 中帶有切片的並發映射的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除