跟着google工程师学Go语言(二十):Golang通道Channel

欢迎来到:Google资深工程师深度讲解Go语言

视频地址:Google资深工程师深度讲解Go语言- 通道Channel

Go 语言为构建并发程序的基本代码块是 协程 (goroutine)通道 (channel)

一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。几乎所有’正式’的程序都是多线程的,以便让用户或计算机不必等待,或者能够同时服务多个请求(如 Web 服务器),或增加性能和吞吐量(例如,通过对不同的数据集并行执行代码)。一个并发程序可以在一个处理器或者内核上使用多个线程来执行任务,但是只有同一个程序在某个时间点同时运行在多核或者多处理器上才是真正的并行

通道

在这里插入图片描述

Go 使用 channels 来同步协程

协程是轻量的,比线程更轻:使用 4K 的栈内存就可以在堆中创建它们。
栈的管理是自动的,但不是由垃圾回收器管理的,而是在协程退出后自动释放

协程是通过使用关键字 go 调用(执行)一个函数或者方法来实现的(也可以是匿名或者 lambda 函数)。这样会在当前的计算过程中开始一个同时进行的函数,在相同的地址空间中并且分配了独立的栈,比如:go sum(bigArray),在后台计算总和。

在一个协程中,比如它需要进行非常密集的运算,你可以在运算循环中周期的使用 runtime.Gosched():这会让出处理器,允许运行其他协程;它并不会使当前协程挂起,所以它会自动恢复执行。使用 Gosched() 可以使计算均匀分布,使通信不至于迟迟得不到响应。

  • 使用通道进行协程间通信

工厂的传送带是个很有用的例子。一个机器(生产者协程)在传送带上放置物品,另外一个机器(消费者协程)拿到物品并打包。

通道服务于通信的两个目的:值的交换,同步的,保证了两个计算(协程)任何时候都是可知状态。
在这里插入图片描述
通常使用这样的格式来声明通道:var identifier chan datatype

未初始化的通道的值是nil。

所以通道只能传输一种类型的数据,比如 chan int 或者 chan string,所有的类型都可以用于通道,空接口 interface{} 也可以。甚至可以(有时非常有用)创建通道的通道。

通道实际上是类型化消息的队列:使数据得以传输。
通道也是引用类型,所以我们使用 make() 函数来给它分配内存。这里先声明了一个字符串通道 ch1,然后创建了它(实例化):

var ch1 chan string
ch1 = make(chan string)

当然可以更短: ch1 := make(chan string)

这里我们构建一个int通道的通道: chanOfChans := make(chan int)

或者函数通道:funcChan := chan func()

  • 通信操作符 <-
    这个操作符直观的标示了数据的传输:信息按照箭头的方向流动

参考文档,Go入门指南:协程与通道

猜你喜欢

转载自blog.csdn.net/u010363932/article/details/82795617