12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package dao
- import (
- "context"
- "sync"
- accountApi "go-common/app/service/main/account/api"
- account "go-common/app/service/main/account/model"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- )
- const (
- _perCall = 50
- )
- func chain(ids ...[]int64) []int64 {
- res := make([]int64, 0, len(ids))
- for _, l := range ids {
- res = append(res, l...)
- }
- return res
- }
- func uniq(ids ...[]int64) []int64 {
- hm := make(map[int64]struct{})
- for _, i := range chain(ids...) {
- hm[i] = struct{}{}
- }
- res := make([]int64, 0, len(ids))
- for i := range hm {
- res = append(res, i)
- }
- return res
- }
- // RPCInfos rpc info get by muti mid .
- func (d *Dao) RPCInfos(c context.Context, mids []int64) (res map[int64]*account.Info, err error) {
- var (
- g errgroup.Group
- l sync.RWMutex
- )
- mids = uniq(mids)
- total := len(mids)
- pageNum := total / _perCall
- if total%_perCall != 0 {
- pageNum++
- }
- res = make(map[int64]*account.Info, total)
- for i := 0; i < pageNum; i++ {
- start := i * _perCall
- end := (i + 1) * _perCall
- if end > total {
- end = total
- }
- g.Go(func() (err error) {
- midsReq := &accountApi.MidsReq{Mids: mids[start:end]}
- infosReply, err := d.accountClient.Infos3(c, midsReq)
- if err != nil {
- log.Error("d.accountClient.Infos3(%+v) error(%v)", midsReq, err)
- err = nil
- return
- }
- for mid, info := range infosReply.Infos {
- l.Lock()
- res[mid] = info
- l.Unlock()
- }
- return
- })
- }
- if err = g.Wait(); err != nil {
- log.Error("g.Wait error(%v)", err)
- }
- return
- }
|