go语言学习(3)-协程

现在主流os调用粒度为线程,产生时钟中断后,中断处理函数,如果当前线程时间片使用完毕。则切换到其他的线程,资源开销很大。还有创建和销毁线程是和很消耗线程资源的。特别是对于我们后台程序开发,为了减少不必要的性能开销,广泛采用"池"进行维护。

于是乎协程出现了,协程可以理解为用户级别线程,它的调用由线程实现,线程进行协程调用(协议可以主动让出时间片)。所以开销非常小,据统计(不知道真否,没有测试过)进程可以直接开上w的协程。其实其实这个在很久以前就提出过这个概念。现在在一些的脚本语言(比如说lua,python)已经开始支持。C语言中也有很多类似开源的协程库,(例如腾讯的协程库libco)。

go语言语言级别支持协程。使用关键字go,代码如下:

func Run(){
/*
*代码实现
*/
}
go Run()

现在启动了一个Run()协程,当然我们也给协程函数()传递参数

他同时支持对象的成员函数(),代码如下:

type Person struct{

}

func (this *Person) See(){
/*
*代码实现
*/
}

func main(){
var person Person

go person.See()
}
这样的话,我们就不需要进行所谓的“池”的维护,异步任务采用协程去做,不用担心协程开销,对被动的连接处理,直接开启协程进行IO操作。开发者心智成本大大降低。

协程的使用自然少不了协程之间通信,协程之间通信采用隧道channel,channel也是一个引用对象,通过内置函数make(),代码如下:

io_chann:=make(chan int, 1)//创建大小1,类型为int的隧道
io_chann<-1 
io_chann<-2 // 隧道已经满,阻塞


这里主要说一下协程如何通信:代码如下:

func Recv(chann chan int) {
	for {
		<-chann // 不关心它的值
	}
}

func Send(chann chan int) {
	for {
		chann <- 1
	}
}

func main() {

	chann := make(chan int, 256) // 大小256
	go Recv(chann)
	go Send(chann)
	time.Sleep(100 * time.Second)

上面就是一个简单的协程之间通信,很简单











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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值