什么时候用 Goroutine?什么时候用 Channel?
什么场景下用 channel 合适呢?
通过全局变量加锁同步来实现通讯,并不利于多个协程对全局变量的读写操作。
加锁虽然可以解决 goroutine 对全局变量的抢占资源问题,但是影响性能,违背了原则。
总结:为了解决上述的问题,我们可以引入 channel,使用 channel 进行协程 goroutine 间的通信。
Go 语言中的操作系统线程和 goroutine 的关系:
一个操作系统线程对应用户态多个 goroutine。
go 程序可以同时使用多个操作系统线程。
Goroutine 和 OS 线程是多对多的关系,即 m:n。
Go 语言的并发模型是 CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信,引出了 channel。
通道 channel 使用示例:
for range 从通道中取值,通道关闭时 for range 退出
复制代码
channel 升级,单通道,只读通道和只写通道
复制代码
goroutine work pool,可以防止 goroutine 暴涨或者泄露
复制代码
goroutine 使用 select case 多路复用,满足我们同时从多个通道接收值的需求
复制代码
goroutine 加锁 排它锁 读写锁
复制代码
一起学习,升级打怪
我们搞了一个对学 Go 真正有帮助的群,欢迎加入:
公众号:程序员升级打怪之旅
微信号:wangzhongyang1993
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/74e7d37a8401208231960e205】。文章转载请联系作者。
评论 (1 条评论)