GoLang并发编程之Future模式的实现

GoLang并发编程之Future模式的实现

一、概述

​ 在日常编程中,可能会遇到这样一个场景,一个任务可能有好几件事需要去做,并且这些事是完全可以并发执行的,除此之外,我们还需要得到其执行结束后的结果,并以此来进行后续的一些处理。

​ 这个时候就可以考虑去使用Go编程当中的Future模式

二、代码示例

1、构建结构体FutureTask

​ 这里我们将要做的事情抽象成任务,对于每个任务我们可能需要传递参数过去,并且我们还需要得到这个任务的执行结果,为此,我们创建两个channel,一个用于传递参数,一个用于保存结果。(具体还需要什么其他的参数可以根据具体业务进行设计)

// FutureTask 在并发执行时用于传递参数和保存返回的结果
type FutureTask struct {
    
    
	// 用于传递参数
	args chan interface{
    
    }

	// 实际业务中可能还有很多其他的数据

	// 用于保存结果
	res chan interface{
    
    }
}

2、创建goroutine执行future的方法

​ 在创建好FutureTask之后,需要开启goroutine去执行,为此需要创建一个执行FutureTask的方法

// execFutureTask 用于开启一个Future模式的线程
func execFutureTask(futureTask *FutureTask) {
    
    
	// 读取传入的参数
	fmt.Println("goroutine读取到的参数:", <-futureTask.args)

	// 这里可以执行具体的业务逻辑
	result := "执行完业务逻辑后得到的结果"

	// 将结果进行保存
	futureTask.res <- result
	defer close(futureTask.res)
	return
}

3、测试代码

func main() {
    
    

	// 创建一个FutureTask并开启一个goroutine去执行
	futureTask := FutureTask{
    
    make(chan interface{
    
    }), make(chan interface{
    
    })}
	go execFutureTask(&futureTask)

	// 向FutureTask传入参数,如果不传的话会死锁
	futureTask.args <- "main线程传入的参数"

	// 这里可以并行的去执行一些其他业务逻辑
	time.Sleep(1 * time.Second)

	// 读取线程执行的
	fmt.Println("主线程读取future模式下goroutine的结果:", <-futureTask.res)
	
}

4、执行结果

goroutine读取到的参数: main线程传入的参数

主线程读取future模式下goroutine的结果: 执行完业务逻辑后得到的结果

三、小结

​ 本篇介绍了future的一个实现思路,提供的案例代码可以直接被改造使用。因为goroutine之间是没有依赖关系的,因此通过channel,用于达到goroutine相互协作的效果。

​ 这里补充一点小知识:Go语言借鉴了《Communicating Squential Processes》(CSP),这是20世纪的计算机领域一位大牛的论文,文中将并发系统抽象成为了ChannelProcess,前者用于传递消息,后者用于执行,两者相互独立,无从属关系,但是消息的收发有严格的顺序

猜你喜欢

转载自blog.csdn.net/weixin_44829930/article/details/123606804