目录
前言
正文
前言
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
主函数结束
通过结果,我们得出如下结论:当主函数停止后,子协程也会终止,即使它还有没有执行完毕。此时,子协程可能还没有执行,也可能执行了一半。
作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄