Concurrent mapping with slices in golang
php editor Banana brought a wonderful article about the concurrent mapping of slices in golang. In this article, we will look at how to use slices for mapping operations in a concurrent environment and explain why slices are very useful in concurrent programming. By using golang's concurrency mechanism, we can access and modify slices in multiple goroutines at the same time, thereby improving the performance and efficiency of the program. Whether you are a beginner or an experienced golang developer, this article will bring you valuable knowledge and practical skills. Let's explore concurrent mapping with slices in golang!
Question content
I've been trying to solve a concurrency issue after one of the developers in the field left a few months ago, but I can't find a proper way to solve this problem.
For context, we load the customer data into a structure like this:
[ key ] -> { value }
[Customer Specific Hash] -> {Data Point/File Slice}
Example - really bad formatting, sorry:
[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...]}, }
The above is because we have 100,000 customers and every night we start a process that consolidates the data based on each customer's hash (or actually a bucket). Before processing the dataframes, we iterate over the slices and "merge" the dataframes into one large dataframe that contains many legal/accounting rules.
It runs in a goroutine to index all data points as quickly as possible.
So the implementation is essentially a sync.Map[string, []DataFrame]
But I noticed that while the map operation is protected, appending to the DataFrame slice is not. Each hash probably has around 20-30 file references in that slice per night.
There's a good chance that customer data has been merged incorrectly over the past two years and I'm tasked with fixing it. Before sync.map, they again used RWMutex with Map, but not slicing, which points to this article as a guide.
First of all, is the idea of a Map containing slices an appropriate data structure?
I'm trying to create a RWMutex based tile handler but was wondering if the Map could have a chan DataFrame
instead put in when indexing the customer files and then once complete merge them in a second step into an array (such as len(chanx)
) will it be known?
I'm mainly from Java, so I might be confused with some terminology, so I'm sorry.
Solution
You have two different problems:
- Concurrency issues occurred when updating the map
- Concurrency issues when updating map entries
sync.Map
will prevent 1, but not 2.
One way to solve this problem is:
sync.Map[string, *DFrame]
where
type DFrame struct { sync.RWMutex Data []DataFrame }
Once you get the entry from the map, you should Lock
or RLock
it and then use the data. This isn't limited to just appending slices. Even if you are only reading from a dataframe, you must RLock
the structure.
So if you want to append a new dataframe:
df := &DFrame{} entry,_:=m.LoadOrStore(key, df) dfEntry:=entry.(*DFrame) dfEntry.Lock() dfEntry.Data=append(dfEntry.Data, newDataFrame) dfEntry.Unlock()
The above is the detailed content of Concurrent mapping with slices in golang. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











Use Golang to develop powerful desktop applications. With the continuous development of the Internet, people have become inseparable from various types of desktop applications. For developers, it is crucial to use efficient programming languages to develop powerful desktop applications. This article will introduce how to use Golang (Go language) to develop powerful desktop applications and provide some specific code examples. Golang is an open source programming language developed by Google. It has the characteristics of simplicity, efficiency, strong concurrency, etc., and is very suitable for

Security challenges in Golang development: How to avoid being exploited for virus creation? With the wide application of Golang in the field of programming, more and more developers choose to use Golang to develop various types of applications. However, like other programming languages, there are security challenges in Golang development. In particular, Golang's power and flexibility also make it a potential virus creation tool. This article will delve into security issues in Golang development and provide some methods to avoid G

Title: Steps and techniques for using Golang programming on Mac In the current field of software development, Golang (also known as Go), as an efficient, concise, and highly concurrency programming language, has attracted the attention of more and more developers. use. When programming Golang on the Mac platform, you can use some tools and techniques to improve development efficiency. This article will introduce the steps and techniques of using Golang programming on Mac, and provide specific code examples to help readers better understand and apply. Step 1: Install Gol

Golang (Go language for short) as a programming language has gradually emerged in the blockchain field in recent years. Its efficient concurrent processing capabilities and concise syntax features make it a favored choice in blockchain development. This article will explore how Golang helps the development of blockchain and demonstrate its superiority in blockchain applications through specific code examples. 1. Golang’s advantages in the blockchain field: Efficient concurrent processing capabilities: Nodes in the blockchain system need to process a large amount of transactions and data at the same time, and Gola

Golang is an open source programming language developed by Google and is widely used in back-end service development, cloud computing, network programming and other fields. As a statically typed language, Golang has an efficient concurrency model and a powerful standard library, so it is favored by developers. However, in actual development, Golang developers usually need to combine other programming languages for project development to meet the needs of different scenarios. PythonPython is an object-oriented programming language that is concise, clear, and easy to learn.

Gokit is a Golang microservice framework that improves API performance through optimized, scalable, maintainable and test-friendly features. It provides a range of tools and patterns that enable users to quickly build performant and maintainable APIs. In actual production, it is widely used in API construction of large platforms such as Netflix, Spotify and Uber, handling massive requests.

As a fast and efficient programming language, Golang language is favored by more and more developers. However, in daily development, we will inevitably encounter various errors. How to correctly analyze the causes of errors and find solution strategies is an important skill that every Golang developer needs to understand and master in depth. Error analysis type assertion failure In Golang, type assertion is a common operation, but sometimes if the types do not match, panic will occur. Here is a simple example: varxinter

Title: Sharing practical techniques for replacing spaces in Golang. With the popularity and development of the Internet, program design and development have become more and more important. In the programming process, data processing is a very critical part. When processing text data, you often encounter situations where you need to replace spaces. This article will share how to implement the technology of replacing spaces in Golang and provide specific code examples. Why do I need to replace spaces? Spaces are one of the common special characters in text data. Sometimes we need to replace spaces with other characters or remove spaces.
