zhangzengfei
2024-09-26 88b1f1d1d14a8fe9e3dde2f363a89d821fc0e641
cache/shardmap/shardmap.go
@@ -93,23 +93,27 @@
func (s *ShardMap) Walk(wf wfOp, sourceFea []float32, baseScore float32) (targets []*protomsg.SdkCompareEach) {
   var wg sync.WaitGroup
   var lock sync.Mutex
   for _, si := range s.shards {
      var tempsi shardItem = *si
   for _, si := range s.shards {
      var tempsi *shardItem = si // 保持对原始 shardItem 的指针引用
      // 跳过空分片
      if len(tempsi.data) == 0 {
         continue
      }
      wg.Add(1)
      go func(st *shardItem, fn wfOp, srcFeat []float32, baseSec float32) {
         defer wg.Done()
         st.RLock()         // 锁定读取
         defer st.RUnlock() // 确保读取完毕后解锁
         for _, feature := range st.data {
            // 读取操作在锁内进行,防止并发冲突
            if item, ok := feature.(*db.FeatureCacheBase); ok {
               score := float32(0)
               score = fn(srcFeat, item.FaceFeature)
               score := fn(srcFeat, item.FaceFeature)
               if score > 0 && score >= baseScore {
                  lock.Lock()
                  lock.Lock() // 保护目标切片的写入
                  targets = append(targets, &protomsg.SdkCompareEach{
                     Id:           item.Id,
                     CompareScore: score,
@@ -119,13 +123,11 @@
               }
            }
         }
      }(&tempsi, wf, sourceFea, baseScore)
      }(tempsi, wf, sourceFea, baseScore)
   }
   wg.Wait()
   return targets
}
// print all