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世纪的计算机领域一位大牛的论文,文中将并发系统抽象成为了
Channel
和 Process
,前者用于传递消息,后者用于执行,两者相互独立,无从属关系,但是消息的收发有严格的顺序推荐阅读
- 面试官(来说一说Go语言的函数调用惯例)
- Go|使用 grpcurl 通过命令行访问 gRPC 服务
- Go Timer 详解以及 Reset 和 Stop 的正确用法
- 遇见Golang|ETCD 的组件架构和内部通信
- 区块链|【智能合约】Go语言调用智能合约 | geth
- 区块链|夹子机器人/BSC,源码,部署教程
- 多线程|盘点认证协议 : 普及篇之ADFS , WS-Federation
- UE4引擎|UE4 Sockets多线程TCP通信
- OS|多进程和多线程的区别是什么(多进程和多线程的优缺点分析)