简单回答下!
如果你只是一个 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 学习历程。