[golang基础] golang开发思想(future模式)

前言:
		最近在学习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)
}
发布了197 篇原创文章 · 获赞 73 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39397165/article/details/105447017