登录
首页 >  Golang >  Go问答

在迭代映射的同时并发修改映射时,如何使用 RWMutex

来源:stackoverflow

时间:2024-03-16 12:18:28 358浏览 收藏

并发修改映射时使用 RWMutex 的正确方法是,在迭代映射时获取读锁,然后在更新值时获取写锁。这样做可以确保映射在整个迭代过程中保持一致,并且不会出现数据竞争的情况。另一种方法是先收集要更新的键的数组,然后在释放读锁后并发地更新值。

问题内容

我想使用地图的键向 api 请求某些内容,然后根据 api 的响应更新相应的值。

我的猜测是以下代码。

或者也许可以尝试这种方法,在迭代之前收集数组中的映射键 然后使用数组条目发出请求并修改地图

wg := &sync.WaitGroup{}
wg.Add(len(someMap))

sem := semaphore.NewWeighted(maxWorkers)
ctx := context.TODO()
mutex := &sync.RWMutex{}

mutex.RLock()
for k, v := range someMap {
    mutex.RUnlock()
    go func(k, v) {
        defer wg.Done()

        sem.Acquire(ctx, 1)
        res, err := API.REQUEST(k)
        sem.Release(1)

        if err != nil {
            return
        }

        v.SomeElement = res.SomeElement
        mutex.Lock()
        someMap[k] = v
        mutex.Unlock()
    }(k, v)
    mutex.RLock()
}
mutex.RUnlock()

wg.Wait()

解决方案


你正在做的事情应该有效。但是,请注意,在 runlock 和 rlock 之间,您所做的只是创建一个 goroutine,因此您将有很多 goroutine 等待锁定。首先迭代映射然后修改更容易阅读和调试。或者,您可以更改映射并拥有 map[keytype]struct{value *valuetype},然后您不需要锁定映射,并且无需互斥体即可运行您的 goroutine。每个goroutine都会修改map[k].value而不是map[k]。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在迭代映射的同时并发修改映射时,如何使用 RWMutex》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>