editor php Banana membawakan artikel menarik tentang pemetaan serentak hirisan di golang. Dalam artikel ini, kita akan melihat cara menggunakan kepingan untuk operasi pemetaan dalam persekitaran serentak dan menerangkan sebab kepingan sangat berguna dalam pengaturcaraan serentak. Dengan menggunakan mekanisme konkurensi golang, kami boleh mengakses dan mengubah suai kepingan dalam berbilang goroutin pada masa yang sama, dengan itu meningkatkan prestasi dan kecekapan program. Sama ada anda seorang pemula atau pembangun golang yang berpengalaman, artikel ini akan membawa anda pengetahuan yang berharga dan kemahiran praktikal. Mari terokai pemetaan serentak dengan kepingan dalam golang!
Saya telah cuba menyelesaikan isu konkurensi selepas salah seorang pembangun dalam bidang itu pergi beberapa bulan yang lalu, tetapi saya tidak dapat mencari cara yang betul untuk menyelesaikan masalah ini.
Untuk konteks, kami memuatkan data pelanggan ke dalam struktur seperti ini:
[ 键 ] -> { 值 }
[客户特定哈希] -> {数据点/文件切片}
Contoh - pemformatan yang sangat teruk, maaf:
[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...]}, }
Perkara di atas adalah kerana kami mempunyai 100,000 pelanggan dan setiap malam kami memulakan proses untuk menyatukan data berdasarkan hash setiap pelanggan (atau sebenarnya baldi). Sebelum memproses bingkai data, kami mengulangi kepingan dan "mencantumkan" bingkai data menjadi satu bingkai data besar yang mengandungi banyak peraturan undang-undang/perakaunan.
Ia berjalan dalam goroutine untuk mengindeks semua titik data secepat mungkin.
Jadi pelaksanaannya pada dasarnya adalah sync.Map[string, []DataFrame]
Tetapi saya perhatikan bahawa sementara operasi peta dilindungi, penambahan pada kepingan bingkai data tidak. Setiap cincang mungkin mempunyai sekitar 20-30 rujukan fail dalam kepingan itu setiap malam.
Ada peluang yang baik bahawa data pelanggan telah digabungkan secara tidak betul sejak dua tahun lalu dan saya ditugaskan untuk membetulkannya. Sebelum sync.map, mereka sekali lagi menggunakan RWMutex dengan Map, tetapi tidak menghiris, yang menunjukkan kepada artikel ini sebagai panduan.
Pertama sekali, adakah idea Peta yang mengandungi kepingan merupakan struktur data yang sesuai?
Saya cuba mencipta pengendali kepingan berdasarkan RWMutex tetapi tertanya-tanya sama ada Peta boleh memilikinya chan DataFrame
来代替在索引客户文件时放入,然后一旦完成,第二步将其合并到一个数组中(如len(chanx)
) adakah ia akan diketahui?
Saya terutamanya dari Jawa jadi saya mungkin keliru dengan beberapa istilah jadi saya minta maaf.
Anda mempunyai dua masalah berbeza:
sync.Map
akan menghalang 1, tetapi bukan 2.
Salah satu cara untuk menyelesaikan masalah ini ialah:
sync.Map[string, *DFrame]
Di mana
type DFrame struct { sync.RWMutex Data []DataFrame }
Sebaik sahaja anda mendapat entri daripada peta, anda harus Lock
或 RLock
它,然后使用数据。这不仅仅限于切片的附加。即使您只从数据帧中读取,您也必须 RLock
strukturnya.
Jadi jika anda ingin menambah bingkai data baharu:
df := &DFrame{} entry,_:=m.LoadOrStore(key, df) dfEntry:=entry.(*DFrame) dfEntry.Lock() dfEntry.Data=append(dfEntry.Data, newDataFrame) dfEntry.Unlock()
Atas ialah kandungan terperinci Pemetaan serentak dengan hirisan dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!