前言:
最近在学习golang,golang并发支持比较好,goroutine+channel这个思想,大大提高了并行效率。既然golang有这个特性,我在做一些多个子调用的时候完全可以使用channel来将串行调用更改为异步调用,大大提高运行效率。所以今天就来学习一下future模式。
1. 什么是future模式
我们经常在编程的时候,经常会在一个函数里面调用多个子调用的情况,这些子调用相互之间没有依赖,如果串行调用,会耗时很长,这时就可以使用future模式来进行开发。
基本原理:
- 使用chan作为函数参数
- 启动goroutine调用函数
- 通过chan传入参数
- 做其他可以并行处理的事情
- 通过chan异步获取结果
2. futrue好处?
future 最大的好处是将函数的同步调用转换为异步调用,适用于一个交易需要多个子调用且这些子调用没有依赖的场景。
工作流程图如下:
3. 样例
这里模拟查询数据库的操作,使用futurem模式进行开发
package main
import (
"fmt"
"time"
)
//future 模式
/**
* 1. 使用chan作为函数参数
* 2. 启动goroutine调用函数
* 3. 通过chan传入参数
* 4. 做其他可以并行处理的事情
* 5. 通过chan异步获取结果
*/
type query struct {
//参数channel
sql chan string
//结果channel
result chan string
}
//执行Query
func execQuery(q query) {
//启动一个goroutine
go func() {
sql := <-q.sql
//访问数据库函数 这里省略
//查询结束后 输出结果通道
q.result <- "result form " + sql
}()
}
func main() {
//初始化query
q := query{
sql: make(chan string,1),
result: make(chan string,1),
}
// 开启一个goroutine 执行 sql查询
go execQuery(q)
//发送参数
q.sql <- "select * from table"
time.Sleep(1*time.Second)
fmt.Println(<-q.result)
}