package matcher import ( "sync" util "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/logger" . "bp.jydev.jianyu360.cn/BaseService/pushpkg/p" ) type Matcher interface { Match(poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string) ToMatch(info map[string]interface{}) (*map[*UserInfo]*MatchUser, *[]*UserInfo) } // func EachFoMatch(matcher Matcher, poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string) { defer util.Catch() logger.Info("开始匹配数据。。。") userMap := map[*UserInfo]*SortList{} projectUserMap := map[*UserInfo]*[]string{} lock := &sync.Mutex{} var index int matchPool := make(chan bool, poolSize) matchWaitGroup := &sync.WaitGroup{} for _, temp := range *datas { matchPool <- true matchWaitGroup.Add(1) go func(info map[string]interface{}) { defer util.Catch() defer func() { matchWaitGroup.Done() <-matchPool }() users, projectUsers := matcher.ToMatch(info) lock.Lock() defer lock.Unlock() if users != nil && len(*users) > 0 { for k, v := range *users { l := userMap[k] if l == nil { l = &SortList{} } *l = append(*l, &MatchInfo{ Info: info, Keys: v.Keys, Items: v.Items, MatchWays: v.MatchWays, Extend: map[string]interface{}{}, }) userMap[k] = l } } if projectUsers != nil && len(*projectUsers) > 0 { for _, v := range *projectUsers { l := projectUserMap[v] if l == nil { l = &[]string{} } *l = append(*l, util.ObjToString(info["_id"])) projectUserMap[v] = l } } }(temp) index++ if index%500 == 0 { logger.Info("匹配数据", index) } } matchWaitGroup.Wait() logger.Info("匹配数据结束。。。", index) return &userMap, &projectUserMap }