Go——并发范式(future模式)

future模式

编程中经常遇到在一个流程中需要调用多个子调用的情况,这些子调用相互之间没有依赖,如果串行地调用,则耗时会很长,此时可以使用Go并发编程中的future模式。

future模式的基本工作原理:

  1. 使用chan作为函数参数。
  2. 启动goroutine调用函数。
  3. 通过chan传入参数。
  4. 做其他可以并行处理的事情。
  5. 通过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模式工作流程如图:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值