future模式
编程中经常遇到在一个流程中需要调用多个子调用的情况,这些子调用相互之间没有依赖,如果串行地调用,则耗时会很长,此时可以使用Go并发编程中的future模式。
future模式的基本工作原理:
- 使用chan作为函数参数。
- 启动goroutine调用函数。
- 通过chan传入参数。
- 做其他可以并行处理的事情。
- 通过chan异步获取结果。
下面通过一段抽象的代码来学习该模式:
package main
import (
"fmt"
"time"
)
func main() {
//初始化Query
q := query{make(chan string, 1), make(chan string, 1)}
//执行Query,注意执行的时候无须准备参数
go execQuery(q)
//发送参数
q.sql <- "select * from table"
//做其他事情,通过sleep描述
time.Sleep(1 * time.Second)
//获取结果
fmt.Println(<-q.result)
}
//一个查询结构体
//这里的sql和result是一个简单的抽象,具体的应用可能是更复杂的数据类型
type query struct {
//参数Channel
sql chan string
//结果Channel
result chan string
}
//执行Query
func execQuery(q query) {
//启动协程
go func() {
//获取输入
sql := <-q.sql
//访问数据库
//输出结果通道
q.result <- "result from " + sql
}()
}
future最大的好处是将函数的同步调用转换为异步调用,适用于一个交易需要多个子调用且这些子调用没有依赖的场景。实际情况可能比上面示例复杂得多,要考虑错误和异常的处理,
future模式工作流程如图: