From db7c95885d55368653087849bd6b7900d72e7927 Mon Sep 17 00:00:00 2001 From: liuyunchao-1998 Date: Mon, 28 Jul 2025 20:45:10 +0800 Subject: [PATCH] fix: Optimize the GetDraftIntelligenceList function and reduce the use of goroutine (#171) --- backend/application/search/project_search.go | 48 ++++++++++++------- backend/application/search/resource_search.go | 46 +++++++++++------- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/backend/application/search/project_search.go b/backend/application/search/project_search.go index 6c26da8c..a45300ad 100644 --- a/backend/application/search/project_search.go +++ b/backend/application/search/project_search.go @@ -76,26 +76,38 @@ func (s *SearchApplicationService) GetDraftIntelligenceList(ctx context.Context, intelligenceDataList := make([]*intelligence.IntelligenceData, len(searchResp.Data)) logs.CtxDebugf(ctx, "[GetDraftIntelligenceList] searchResp.Data: %v", conv.DebugJsonToStr(searchResp.Data)) + if len(searchResp.Data) > 1 { + for idx := range searchResp.Data[1:] { + index := idx + 1 + data := searchResp.Data[index] + tasks.Go(func() error { + info, err := s.packIntelligenceData(ctx, data) + if err != nil { + logs.CtxErrorf(ctx, "[packIntelligenceData] failed id %v, type %d , name %s, err: %v", data.ID, data.Type, data.GetName(), err) + return err + } - for idx := range searchResp.Data { - data := searchResp.Data[idx] - index := idx - tasks.Go(func() error { - info, err := s.packIntelligenceData(ctx, data) - if err != nil { - logs.CtxErrorf(ctx, "[packIntelligenceData] failed id %v, type %d , name %s, err: %v", data.ID, data.Type, data.GetName(), err) - - return err - } - - lock.Lock() - defer lock.Unlock() - intelligenceDataList[index] = info - return nil - }) + lock.Lock() + defer lock.Unlock() + intelligenceDataList[index] = info + return nil + }) + } + } + if len(searchResp.Data) != 0 { + info, err := s.packIntelligenceData(ctx, searchResp.Data[0]) + if err != nil { + logs.CtxErrorf(ctx, "[packIntelligenceData] failed id %v, type %d , name %s, err: %v", searchResp.Data[0].ID, searchResp.Data[0].Type, searchResp.Data[0].GetName(), err) + return nil, err + } + lock.Lock() + intelligenceDataList[0] = info + lock.Unlock() + } + err = tasks.Wait() + if err != nil { + return nil, err } - - _ = tasks.Wait() filterDataList := make([]*intelligence.IntelligenceData, 0) for _, data := range intelligenceDataList { if data != nil { diff --git a/backend/application/search/resource_search.go b/backend/application/search/resource_search.go index b563c34e..449e6d1e 100644 --- a/backend/application/search/resource_search.go +++ b/backend/application/search/resource_search.go @@ -86,25 +86,39 @@ func (s *SearchApplicationService) LibraryResourceList(ctx context.Context, req lock := sync.Mutex{} tasks := taskgroup.NewUninterruptibleTaskGroup(ctx, 10) resources := make([]*common.ResourceInfo, len(searchResp.Data)) - for idx := range searchResp.Data { - v := searchResp.Data[idx] - index := idx - tasks.Go(func() error { - ri, err := s.packResource(ctx, v) - if err != nil { - logs.CtxErrorf(ctx, "[LibraryResourceList] packResource failed, will ignore resID: %d, Name : %s, resType: %d, err: %v", - v.ResID, v.GetName(), v.ResType, err) - return err - } + if len(searchResp.Data) > 1 { + for idx := range searchResp.Data[1:] { + index := idx + 1 + v := searchResp.Data[index] + tasks.Go(func() error { + ri, err := s.packResource(ctx, v) + if err != nil { + logs.CtxErrorf(ctx, "[LibraryResourceList] packResource failed, will ignore resID: %d, Name : %s, resType: %d, err: %v", + v.ResID, v.GetName(), v.ResType, err) + return err + } - lock.Lock() - defer lock.Unlock() - resources[index] = ri - return nil - }) + lock.Lock() + defer lock.Unlock() + resources[index] = ri + return nil + }) + } + } + if len(searchResp.Data) != 0 { + ri, err := s.packResource(ctx, searchResp.Data[0]) + if err != nil { + return nil, err + } + lock.Lock() + resources[0] = ri + lock.Unlock() + } + err = tasks.Wait() + if err != nil { + return nil, err } - _ = tasks.Wait() filterResource := make([]*common.ResourceInfo, 0) for _, res := range resources { if res == nil {