go iris 连接 mysql 异步_go语言解决并发的方法有哪些?

简单回答下!

如果你只是一个 IO 操作,没必要在处理函数(协程)再开子协程,没什么用。因为,无论你开不开协程,都需要等待这个 IO 完成。一个 IO 操作,并发启不到提高性能的作用。

如果要提高性能,除非有多个 IO 同时出现在一个处理函数里,并且它们之间没有依赖关系。比如同时请求数据库和 RPC 服务。

一个简单示例。

var wg sync.WaitGroup

wg.Add(2)

go func() {

// 数据库数据 wg.Done()

}()

go func() {

// rpc 服务调用 wg.Done()

}()

// 等待它们都完成wg.Wait()

// 处理其他逻辑// 返回数据

也可以把 WaitGroup 换成你的 channel,这里不存在竞争,用 WaitGroup 更简单点。

这里说的单个函数的性能,每个 http 请求处理函数本来已经是一个协程,如果不存在并发逻辑,请不要为并发而并发。

还有什么办法能提高服务性能?

Go 的并发模型,相对于传统的进程、线程,已经能接收更多的并发请求,这工作是框架会实现的,不用我们考虑。但请求接收进来要能被快速处理,为提高并发性,还是要从处理函数入手。

那如何提高处理函数的性能呢?

一方面,像前面说的,多 IO 请求并发处理。但除此以外,还要把更多工作放在周边服务上,比如数据库优化、使用缓存。如果有一些复杂逻辑,可以尝试异步化处理,比如使用一些消息队列异步化,或者后台批处理。这个话题就大了,不过,一般的场景也不是很难,毕竟不是每个人都有机会遇到大并发量。

提醒一点,提高性能不能只依靠语言解决,还需要学会灵活地根据实际场景寻找解决方案。

欢迎关注我的专栏,Golang 之旅,见证我的 Golang 学习历程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值