-1

我想使用地图的键从 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()
4

1 回答 1

0

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

于 2020-07-10T21:06:35.913 回答