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

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相互协作的效果。
【Golang|GoLang并发编程之Future模式的实现】? 这里补充一点小知识:Go语言借鉴了《Communicating Squential Processes》(CSP),这是20世纪的计算机领域一位大牛的论文,文中将并发系统抽象成为了ChannelProcess,前者用于传递消息,后者用于执行,两者相互独立,无从属关系,但是消息的收发有严格的顺序

    推荐阅读