Golang中的协程是干什么用的?

举报
liuzhen007 发表于 2021/12/24 22:38:15 2021/12/24
【摘要】 目录前言正文前言Golang语言中有一个其他语言都没有的秘密武器——Goroutine,也就是协程。 正文协程是Golang语言中特有的名词,他不同于进程Process和线程Thread。Golang语言中的Goroutine协程与线程类似,属于一种轻量的线程,但是它的创建成本非常小,比起创建线程来更加方便。我们一般使用Goroutine是执行某一个特定的任务,分工更加明确。说了这么多,那么...

目录

前言

正文

前言

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 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄]

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。