当前位置: 首页 > Go语言, 代码艺术 > 正文

Go语言之Channels实际应用

正如Golang社区中常说的:“不要通过共享内存来通信,要通过通信来共享内存”。在Go语言中,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成一个对象,然后把这个对象的指针传入某个channel中,另外一个goroutine从这个channel中读出这个指针,并处理其指向的内存对象。Golang从语言层面保证同一个时间只有一个goroutine能够访问channel里面的数据,所以Golang的做法就是使用channel来通信,通过通信来传递内存数据,使得内存数据在不同的goroutine中传递,而不是使用共享内存来通信。

在笔者的上篇文章《深入理解Go语言的Channels特性》中,讲解了通道的各种特性,那么在实际的项目中,又是如何灵活运用的呢?本篇文章,笔者将结合实际项目中的例子讲解可以实现的各种功能,以满足不同的场景。

一、通道同步

使用通道来同步 Go 协程间的执行状态。这里是一个使用阻塞的接受方式来等待一个 Go 协程的运行结束。

二、通道选择器(select)

Go 的通道选择器 让你可以同时等待多个通道操作。Go 协程和通道以及选择器的结合是 Go 的一个强大特性。

三、超时处理

超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的。得益于通道和 select,在 Go中实现超时操作是简洁而优雅的。

四、定时器

我们常常需要在后面一个时刻运行 Go 代码,或者在某段时间间隔内重复运行。Go 的内置 定时器 和 打点器 特性让这些很容易实现。

五、打点器

打点器和定时器的机制有点相似:一个通道用来发送数据,然后在这个通道上使用内置的 range 来迭代值每隔500ms 发送一次的值。

六、工作池

这个通过上一篇文章中示例的深入讲解,应该是比较容易理解这个工作池的,这类似于一个线程池。

扩展:为了最优地提高工作池的并发性,理论上同时并行的任务量应该与CPU核心的数量相同,所有,上面的代码中的worker数量应该为运行主机的实际CPU核心数,可以runtime.NumCPU()获取,使用runtime.GOMAXPROCS()来设置运行的核心数。

七、速率限制

速率限制是一个重要的控制服务资源利用和质量的途径。传统的做法是通过redis,设置自增key的expire来实现。Go通过Go协程、通道和打点器优雅地的实现了速率限制。

 



这篇博文由 s0nnet 于2018年09月04日发表在 Go语言, 代码艺术 分类下, 通告目前不可用,你可以至底部留下评论。
如无特别说明,独木の白帆发表的文章均为原创,欢迎大家转载,转载请注明: Go语言之Channels实际应用 | 独木の白帆
关键字:

Go语言之Channels实际应用:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter