在迭代中同时修改地图时如何使用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()
iCMS 回答:在迭代中同时修改地图时如何使用RWMutex

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

本文链接:https://www.f2er.com/1958418.html

大家都在问