目录

前言

正文

前言

Golang语言中有一个其他语言都没有的秘密武器——Goroutine,也就是协程。 

正文

协程是Golang语言中特有的名词,他不同于进程Process和线程Thread。Golang语言中的Goroutine协程与线程类似,属于一种轻量的线程,但是它的创建成本非常小,比起创建线程来更加方便。我们一般使用Goroutine是执行某一个特定的任务,分工更加明确。

说了这么多,那么Golang是如何使用协程的呢?接下来我们通过一段代码来了解一下。

代码实例:

package main

import(
    "fmt"
    "time"
)
// 主方法
func main(){
    go testgo() //使用关键字go调用函数或者方法开启一个goroutine
    for i:=0;i<5;i++ {
	time.Sleep(1000 * time.Millisecond) //让程序休眠1秒
        fmt.Println("主函数打印",i)
    }
    fmt.Println("主函数结束")
    
}
// 协程函数
func testgo() {
    for i:=0;i<5;i++ {
        fmt.Println("协程goroutine打印",i)
    }
}

代码执行结果:

协程goroutine打印 0 
协程goroutine打印 1 
协程goroutine打印 2 
协程goroutine打印 3 
协程goroutine打印 4 
主函数打印 0 
主函数打印 1 
主函数打印 2 
主函数打印 3 
主函数打印 4 
主函数结束

通过结果,我们可以发现协程的执行过程不受主程序休眠的影响,只要协程启动,它就会按照自己的逻辑去执行。所以,在主函数休眠的时候,协程把自己的打印任务都执行完了。

但是,是不是子协程的所有执行过程都不受主函数的影响呢?

答案是否定的。

我们把上面代码中的休眠语句注释掉,再来看看执行结果。

修改后的代码:

package main
import(
    "fmt"
    //"time"
)
// 主方法
func main(){
    go testgo() //使用关键字go调用函数或者方法开启一个goroutine
    for i:=0;i<5;i++ {
	//time.Sleep(1000 * time.Millisecond) //让程序休眠1秒
        fmt.Println("主函数打印",i)
    }
    fmt.Println("主函数结束")
    
}
// 协程函数
func testgo() {
    for i:=0;i<5;i++ {
        fmt.Println("协程goroutine打印",i)
    }
}

执行结果:

主函数打印 0 
主函数打印 1 
主函数打印 2 
主函数打印 3 
主函数打印 4 
主函数结束 

多执行几次,有时候会有如下结果:

协程goroutine打印 0
主函数打印 0
主函数打印 1
主函数打印 2
主函数打印 3
主函数打印 4
主函数结束

通过结果,我们得出如下结论:当主函数停止后,子协程也会终止,即使它还有没有执行完毕。此时,子协程可能还没有执行,也可能执行了一半。