文章目录
Future模式
编程中经常遇到在一个流程中需要调用多个子调用的情况,这些子调用相互之间没有依赖,如果串行地调用,则耗时会很长,此时可以使用并发编程中的future模式。
比如我们发送ajax请求的时候,页面进行后续处理,用户无需一直等待请求的结果,可以继续浏览或操作其他内容。
future 模式的基本工作原理:
- 使用chan作为函数参数
- 启动goroutine调用函数
- 通过chan传入参数
- 做其他可以并行处理的事情
- 通过chan异步获取结果
future模式流程图
下面是一个简单的例子:
package main
import (
"fmt"
"time"
)
// 一个查询结构体
// 这里的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
}()
}
func main() {
// 初始化Query
q := query{make(chan string, 1), make(chan string, 1)}
// 执行Query, 注意执行的时候无须准备参数
go execQuery(q)
// 发送参数
q.sql <- "select *fome table"
// 做一些其它的事情, 这里通过Sleep描述
time.Sleep(time.Second)
// 获取结果
fmt.Println(<-q.result)
}
// result from select * from table
其它并发模式
参考资料:
《Go语言核心编程》