Goroutine+Channel+WaitGroup使用

本文介绍了Golang中的Goroutine、Channel和WaitGroup的使用。Goroutine是轻量级线程,Channel用于协程间的通信,WaitGroup则用于等待一组协程的完成。通过示例展示了它们在信号传递、生产者消费者模式、处理Channel满和超时情况下的应用。
摘要由CSDN通过智能技术生成

点击上方“黑光技术”关注之

完美之道,不在无可增加,而在无可删减!

介绍

goroutine

golang语言中最有特色之一的东东就是这个goroutine了,很多时候问起别人为什么golang的好用,golang的网络性能可以那么好,一般都会多多少少想到goroutine,提起goroutine。在linux中内核的调度最小单位是就是thread,同一个进程中的多个thread线程就对应内核中的多个thread实体。所以thread是内核级的,而gorountine是一个不同于thread的概念,gorountine是一个用户态,另外一种说法也就携程,是用户态的一种调度粒度,每个gorountine也有自己的栈空间,而且是在用户内存中的。golang中实现了对用户态的一种代码片段的高效调度执行,就目前来看是非常有效的,而且给用户编程带来了极大的方便。

channel

channel是golang中另外一个最有特色的东东,在c中我们都是用管道,文件,信号等作为线程间通信的手段,但是在golang中几乎都是清一色的使用channel这个东东。channel,即“管道”,是用来传递数据的一个类型,即可以向channel里放入数据,也可以从中获取数据。在golang也有其它的方式作为线程间或者说gorountine之间进行通信,但是golang的编程指导中强烈建议任何地方需要通信都要使用channel,所以channel加上goroutine,就可以组合成一种简单而又强大的处理模型,即N个工作goroutine将处理的中间结果或者最终结果放入一个channel,另外有M个工作goroutine从这个channel拿数据,再进行进一步加工,通过组合这种过程,从而胜任各种复杂的业务。

WaitGroup

go提供了sync包和channel来解决协程同步和通讯。sync.WaitGroup是等待一组协程结束。它实现了一个类似任务队列的结构,你可以向队列中加入任务,任务完成后就把任务从队列中移除,如果队列中的任务没有全部完成,队列就会触发阻塞以阻止程序继续运行。当需要阻塞当前执行线程,等待一组goroutine执行完毕之后再继续执行当前线程时,就需要用到WaitGroup。
sync.WaitGroup只有3个方法,Add(),Done(),Wait()。 其中Done()是Add(-1)的别名。简单的来说,Add就是添加或者减少等待goroutine的数量;Done:相当于Add(-1)使用Add()添加计数,Done()减掉一个计数; Wait:执行阻塞,直到所有的WaitGroup数量变成0。

用法介绍

最常用的方式:作为信号传递

下面的示例中,在子goroutine中进行一个需要一段时间的操作,主goroutine可以做一些别的事情,然后等待子goroutine完成。接收方会一直阻塞直到有数据到来。如果channel是无缓冲的,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值