Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用channel并发从数据库获取多个数据

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

作者头像
用户7962184
发布于 2020-11-20 06:23:36
发布于 2020-11-20 06:23:36
1.7K00
代码可运行
举报
文章被收录于专栏:没事多喝水没事多喝水
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3种方式!Go Error处理最佳实践
导语 | 错误处理一直以一是编程必需要面对的问题,错误处理如果做的好的话,代码的稳定性会很好。不同的语言有不同的出现处理的方式。Go语言也一样,在本篇文章中,我们来讨论一下Go语言的错误处理方式。 一、错误与异常 (一)Error 错误是程序中可能出现的问题,比如连接数据库失败,连接网络失败等,在程序设计中,错误处理是业务的一部分。 Go内建一个error接口类型作为go的错误标准处理 http://golang.org/pkg/builtin/#error // 接口定义type error in
腾讯云开发者
2022/05/10
1.4K1
3种方式!Go Error处理最佳实践
golang context实战
来自官方文档: https://blog.golang.org/context: Incoming requests to a server should create a Context, and outgoing calls to servers should accept a Context. The chain of function calls between them must propagate the Context, optionally replacing it with a derived Context created using WithCancel, WithDeadline, WithTimeout, or WithValue. When a Context is canceled, all Contexts derived from it are also canceled.
王磊-字节跳动
2019/10/21
1.8K0
Kafka 并发消费单个 partition
kafka可以通过多个partition实现并发,但是针对单个partition,必须顺序提交。假如消息发送顺序为1,2,3,如果先提交3,会导致1,2被提交。所以不能并发执行后立即提交。
Yuyy
2023/05/01
1K0
一文弄懂Go语言的Context包,值得收藏!
在开发高效且可维护的 Go 应用程序时,处理超时、取消操作和传递请求范围的数据变得至关重要。
南山竹
2024/08/05
1790
一文弄懂Go语言的Context包,值得收藏!
深入解析fabric的peer命令(三)chaincodeInvokeOrQuery方法
fabric-protos-go是Hyperledger Fabric项目中的一个Go语言包,用于定义和生成与Fabric网络通信相关的协议缓冲区(Protocol Buffers)消息。
酒楼
2023/06/04
1980
并发编程包之 errgroup
上面这个例子来自官方文档,代码量有点多,但是核心主要是在Google这个闭包中,首先我们使用errgroup.WithContext创建一个errGroup对象和ctx对象,然后我们直接调用errGroup对象的Go方法就可以启动一个协程了,Go方法中已经封装了waitGroup的控制操作,不需要我们手动添加了,最后我们调用Wait方法,其实就是调用了waitGroup方法。这个包不仅减少了我们的代码量,而且还增加了错误处理,对于一些业务可以更好的进行并发处理。
Golang梦工厂
2022/07/11
5200
Go 语言 errgroup 库的使用方式和实现原理
在 Go 语言中,我们可以使用 errgroup 库处理 goroutine 中的错误。
frank.
2022/12/27
1.5K0
另一种思维实现一个 work-pool
之前写过一篇文章,它有个响亮的名字: Handling 1 Million Requests per Minute with Go。 这是国外的一个作者写的,我做了一篇说明。起的也是这个标题, 阅读量是我最好的一篇,果然文章都是靠标题出彩的.....
RememberGo
2021/07/04
4430
聊聊loki的Query
loki的Query接口定义了Exec方法,返回Result;Result定义了Data、Statistics属性;query实现了Query接口,其Exec方法执行q.Eval(ctx)及stats.Snapshot。
code4it
2021/02/08
4620
深入Go:使用context包轻松完成并发控制
一次请求到达后台,需要并发启动大量的任务以组合出最终的响应,如何设计实现:一个请求到来之后,X秒超时;超时或遇到错误时立即返回,并取消所有并发任务?其实用了Go context包,这个问题就可以非常优雅自然地解决,并且了解Context之后你会赞叹:“哇,真就该这么设计!”
wenxing
2021/12/14
1.3K0
深入Go:Context
在理解了 package context 的使用后,我们很自然地想问其背后的设计哲学有什么?实际上,我们发现无论是在关于 Context 的批评/讨论也不少,那么 Context 的设计合不合理?带着这些疑虑,我们深入 context 的源码,尝试对这些问题作出解答。
wenxing
2021/12/14
8300
深入Go:Context
2020-06-30 一次极大的优化cpu和内存使用的记录
逻辑是,生成一个任务队列,然后根据并发数共同消费这个队列,每次任务执行完毕后,都会将任务重新放回队列中,这样循环使用。同时,每个任务执行完毕后,若失败,或空执行(即,任务无实际数据的处理),会延长其下次执行时间。每次执行时,若未到执行时间,则直接执行完毕。
天地一小儒
2022/12/28
4010
轻松上手!手把手带你掌握从Context到go设计理念
: 导语 | 本文推选自腾讯云开发者社区-【技思广益 · 腾讯技术人原创集】专栏。该专栏是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。本文作者是腾讯后端开发工程师陈雪锋。 context包比较小,是阅读源码比较理想的一个入手,并且里面也涵盖了许多go设计理念可以学习。 go的Context作为go并发方式的一种,无论是在源码net/http中,开源框架例如gin中,还是内部框架trpc-go中都是一个比较重要的存在,而整个 c
腾讯云开发者
2022/09/27
4030
轻松上手!手把手带你掌握从Context到go设计理念
Golang实现分布式唯一ID生成器
一:数据库主键生成:利用数据库的主键生成来获取唯一ID,但是这种方式依赖数据库组件,并且获取ID的效率也不高。
dddyge
2024/03/26
1.2K0
4.深入TiDB:执行计划执行过程详解
上一篇讲解了 TiDB 的执行优化相关的内容,这篇我们继续往下看,在获取到执行优化结果之后如何执行整个计划。
luozhiyun
2021/09/25
1K0
Golang源码深入-Go1.15.6发起http请求流程-2
上一篇文章我们讲到go client的大概实现的大概思路,整理了相关client.go的核心源码,详情请翻阅:Golang源码深入-Go1.15.6发起http请求流程-1。笔者这一篇分享一下transport.go相关核心的代码,整理相关核心的技术点,希望读者多交流学习。
公众号-利志分享
2022/04/25
7360
Golang源码深入-Go1.15.6发起http请求流程-2
GoLang并发控制(下)
context的字面意思是上下文,是一个比较抽象的词,字面上理解就是上下层的传递,上会把内容传递给下,在go中程序单位一般为goroutine,这里的上下文便是在goroutine之间进行传递。
李海彬
2018/12/14
8830
Go语言并发模型:以并行处理MD5为例
简介 Go语言的并发原语允许开发者以类似于 Unix Pipe 的方式构建数据流水线 (data pipelines),数据流水线能够高效地利用 I/O和多核 CPU 的优势。 本文要讲的就是一些使用流水线的一些例子,流水线的错误处理也是本文的重点。 阅读建议 本文是"Go语言并发模型:像Unix Pipe那样使用channel" 一文的下半部分,但重点在于实践。如果你对 channel 已经比较熟悉,则可以独立阅读。 如果你对 channel 和 go 两个关键字不太熟悉,建议先阅读上半部分。 本文所使用
李海彬
2018/03/26
2.1K0
一日一学_Go语言Context(设计及分析)
Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,该请求上的所有goroutines应该退出,防止资源泄露。那
李海彬
2018/03/28
1.1K0
一日一学_Go语言Context(设计及分析)
Go系列-构建高性能协程池
// Copyright 2017, personal.andre. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package poolimport ("context""errors""sync""time")const (MAX_THREAD_NUMS = 100)var ErrMaxThreadLimi
AndreKzWu
2022/09/19
5251
相关推荐
3种方式!Go Error处理最佳实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验