GO语言-goroutine协程的使用

前言

        协程的英文coroutine,go语言中的协程为goroutine。Go是并发语言,而不是并行语言。

        go语言的协程创建十分简单,只需要在调用的函数前面加上go关键字,程序就会同事运行一个新的goroutine。

        但是goroutine中没有返回值,会忽略返回值。所以往往需要通过channel进行goroutine之间的通信。

goroutine使用

func main() {
	go mytest()
	for i := 0; i < 100; i++ {
		fmt.Println("主函数输出:", i)
	}
}

func mytest() {
	for i := 0; i < 500; i++ {
		fmt.Println("goroutine中输出数字:", i)
	}
}

通过这个简单的示例输出,可以总结goroutine的两个特点:

  1. goroutine协程中的函数执行和主函数的执行是同时的,输出内容是交替的。
  2. 主程序结束后,即使子goroutine没有执行完成,也会随主程序一同结束。

sync包-WaitGroup-同步等待组

        一般情况下,主程序结束后,子goroutine就会结束。

        为了让主程序等待子groutine执行完成,一种方法是使用sleep。但是sleep存在一个问题是,我们没办法知道子goroutine需要执行的具体时长,只能尽量放长sleep的时间。

        所以我们可以使用到sync包的WaitGroup解决主进程等待子goroutine的问题。

var wg sync.WaitGroup

func main() {
	wg.Add(1) //定义WaitGroup队列长度,长度为1
	go mytest()
	for i := 0; i < 100; i++ {
		fmt.Println("主函数输出:", i)
	}
	wg.Wait() //主程序最后,等待WaitGroup队列为0时再退出
}

func mytest() {
	for i := 0; i < 500; i++ {
		fmt.Println("goroutine中输出数字:", i)
	}
	wg.Done() //相当于wg.Add(-1),一个goroutine结束,调用wg.Done(),队列减一
}

var wg sync.WaitGroup        声明同步等待组

wg.Add(1)        主函数中,定义WaitGroup队列长度

wg.Done()        子goroutine中,函数最后调用,相当于将WaitGroup队列长度-1

wg.Wait()        主函数中,在主函数的最后,等待WaitGroup队列长度为0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值