首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用channel并发从数据库获取多个数据

利用channel并发从数据库获取多个数据

作者头像
用户7962184
发布2020-11-20 14:23:36
发布2020-11-20 14:23:36
2.1K0
举报
文章被收录于专栏:没事多喝水没事多喝水

我们在获取用户信息的时候,经常是需要从多个数据源中获取数据,比如获取用户的余额,用户状态,用户拥有物品时,需要拉取多个数据库,如果顺序执行的话,速度不够快,这里分享一种写法。

代码语言:javascript
复制
type dataChan struct {
    data interface{}
    err  error
}

func getMysqlDataByUin(uin int, getDataFunc func(int) (interface{}, error), context context.Context) chan *dataChan {
   result := make(chan *dataChan, 1)
   go func() {
      dataInfo, err := getDataFunc(uin)
      select {
      case <-context.Done():
         close(result)
      default:
         result <- &dataChan{
            data: dataInfo,
            err:  err,
         }
      }
   }()
   return result
}

将获取数据的chan作为结果返回并且并发调用获取数据方法来获取数据

代码语言:javascript
复制
func GatPlayerData(uin int) (*PlayerSaveData, error) {
    ctx, cancel := context.WithCancel(context.Background())
    chanCount := 0
    goldChan := getMysqlDataByUin(uin, readMysql.GetUserGoldInfo, ctx)
    chanCount++
    buffChan := getMysqlDataByUin(uin, readMysql.GetBuffInfo, ctx)
    chanCount++
    resultData := &PlayerSaveData{}
    for i := 0; i < chanCount; i++ {
        select {
        case goldData := <-goldChan:
            if goldData.err != nil {
                cancel()
                return nil, errors.WithMessage(goldData.err, "获取金币信息失败")
            }
            goldInfo, ok := goldData.data.([]*MysqlGoldCoin)
            if !ok {
                cancel()
                return nil, errors.New("类转化失败")
            }
            resultData.MyMoney = goldInfo
        case buffData := <-buffChan:
            if buffData.err != nil {
                cancel()
                return nil, errors.WithMessage(buffData.err, "获取buff信息失败")
            }
            info, ok := buffData.data.([]*MysqlBuff)
            if !ok {
                cancel()
                return nil, errors.New("类转化失败")
            }
            resultData.Buffs = info
        }
    }
    return resultData, nil
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档