我有一个resourceId
需要并行循环的数组。并URL
为每个资源生成,然后放入一个映射中,该映射是键(resourcecId),值是 url。
我得到了下面的代码来完成这项工作,但我不确定这是否是正确的方法。我在这里使用sizedwaitgroup来并行化resourceId
列表。并且在将数据写入地图时也使用锁定地图。我确信这不是有效的代码,因为使用 lock 然后使用 sizedwaitgroup 会有一些性能问题。
最好和最有效的方法是什么?我应该在这里使用频道吗?我想控制我应该拥有多少而不是运行resourceId
列表长度的并行度。如果任何resourceId
url 生成失败,我想将其记录为错误,resourceId
但不要中断并行运行的其他 goroutine 以获取为 other 生成的 url resourceId
。
例如:如果有 10 个资源,其中 2 个失败,则记录这 2 个的错误,并且 map 应该有剩余 8 个的条目。
// running 20 threads in parallel
swg := sizedwaitgroup.New(20)
var mutex = &sync.Mutex{}
start := time.Now()
m := make(map[string]*customerPbV1.CustomerResponse)
for _, resources := range resourcesList {
swg.Add()
go func(resources string) {
defer swg.Done()
customerUrl, err := us.GenerateUrl(clientId, resources, appConfig)
if err != nil {
errs.NewWithCausef(err, "Could not generate the url for %s", resources)
}
mutex.Lock()
m[resources] = customerUrl
mutex.Unlock()
}(resources)
}
swg.Wait()
elapsed := time.Since(start)
fmt.Println(elapsed)
注意:上面的代码将从多个读取器线程中以高吞吐量调用,因此它需要执行良好。