体会一下CSP的使用(其实就是使用goroutine + channel)。
定义2个任务:主线任务和分支任务,我们让主线任务花费0.05秒,让分支任务花费0.1秒
//主线任务
func MainTask() string {
//睡0.05秒
time.Sleep(time.Millisecond * 50)
return "我是service()的返回结果"
}
//分支任务
func OtherTask() {
fmt.Println("分支任务开始")
//睡0.1s
time.Sleep(time.Millisecond * 100)
fmt.Println("分支任务结束")
}
接下来我们先尝试串行的做主线任务和分支任务
//串行的完成主线任务+分支任务
//所以完成的时间应该就是 0.05+0.1=0.15s
func TestWorkMethodIsSync(t *testing.T) {
fmt.Println(MainTask())
OtherTask()
}
输出结果:
我是service()的返回结果
分支任务开始
分支任务结束
花费时间: 150.7851ms
串行的完成主线任务+分支任务,所以花费的时间就是所有任务花费时间相加,即:0.1+0.05=0.15s
接下来我们感受一下并行的做主线任务和分支任务:
//异步干活
//其实就是开启了一个协程,在协程里面做主线任务
// 并将主线任务的结果返回给一个通道
func AsyncWorking() chan string {
retCh := make(chan string, 1)
//retCh := make(chan string, 1)
go func() {
ret := MainTask()
fmt.Println("执行完成service()")
retCh <- ret
fmt.Println("发送结果给retCh完成")
}()
return retCh
}
//异步的完成主线任务 +分支任务
//因为是异步的,所以花费的时间是并行的,取大值
//所以最后的花费的时间是max(0.1,0.05)=0.1s
func TestWorkMethodIsAsync(t *testing.T) {
retCh := AsyncWorking()
OtherTask()
fmt.Println(<-retCh)
}
输出结果:
分支任务开始
执行完成service()
发送结果给retCh完成
分支任务结束
我是service()的返回结果
花费时间: 100.6877ms
我们在main方法中也是完成主线任务+分支任务,但和串行的区别是我们开启了一个协程来做主线任务,所以我们可以看到输出的第一行是先打印分支任务的信息,在分支任务中我们有等待0.1秒,而在主线任务中我们有等待0.05秒,主线任务和分支任务是并行的,所以在整个过程中,我们真正花费的时间是两者取大值所花费的时间。