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,所以我可能對一些術語感到困惑,所以我很抱歉。
您有兩個不同的問題:
sync.Map
將防止 1,但無法防止 2。
解決這個問題的一種方法是:
sync.Map[string, *DFrame]
哪裡
type DFrame struct { sync.RWMutex Data []DataFrame }
一旦從地圖中獲取條目,您應該 Lock
或 RLock
它,然後使用資料。這不僅限於切片的附加。即使您只從資料幀中讀取,您也必須 RLock
該結構。
因此,如果您要附加新的資料框:
df := &DFrame{} entry,_:=m.LoadOrStore(key, df) dfEntry:=entry.(*DFrame) dfEntry.Lock() dfEntry.Data=append(dfEntry.Data, newDataFrame) dfEntry.Unlock()
以上是golang 中帶有切片的並發映射的詳細內容。更多資訊請關注PHP中文網其他相關文章!