CSP的hello world

体会一下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秒,主线任务和分支任务是并行的,所以在整个过程中,我们真正花费的时间是两者取大值所花费的时间。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注