在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
欢迎来到:Google资深工程师深度讲解Go语言视频地址:Google资深工程师深度讲解Go语言- 通道Channel Go 语言为构建并发程序的基本代码块是 协程 (goroutine) 与通道 (channel) 一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。几乎所有’正式’的程序都是多线程的,以便让用户或计算机不必等待,或者能够同时服务多个请求(如 Web 服务器),或增加性能和吞吐量(例如,通过对不同的数据集并行执行代码)。一个并发程序可以在一个处理器或者内核上使用多个线程来执行任务,但是只有同一个程序在某个时间点同时运行在多核或者多处理器上才是真正的并行 通道 Go 使用 channels 来同步协程 协程是轻量的,比线程更轻:使用 4K 的栈内存就可以在堆中创建它们。 协程是通过使用关键字 go 调用(执行)一个函数或者方法来实现的(也可以是匿名或者 lambda 函数)。这样会在当前的计算过程中开始一个同时进行的函数,在相同的地址空间中并且分配了独立的栈,比如:go sum(bigArray),在后台计算总和。 在一个协程中,比如它需要进行非常密集的运算,你可以在运算循环中周期的使用 runtime.Gosched():这会让出处理器,允许运行其他协程;它并不会使当前协程挂起,所以它会自动恢复执行。使用 Gosched() 可以使计算均匀分布,使通信不至于迟迟得不到响应。
工厂的传送带是个很有用的例子。一个机器(生产者协程)在传送带上放置物品,另外一个机器(消费者协程)拿到物品并打包。 通道服务于通信的两个目的:值的交换,同步的,保证了两个计算(协程)任何时候都是可知状态。 未初始化的通道的值是nil。 所以通道只能传输一种类型的数据,比如 chan int 或者 chan string,所有的类型都可以用于通道,空接口 interface{} 也可以。甚至可以(有时非常有用)创建通道的通道。 通道实际上是类型化消息的队列:使数据得以传输。
当然可以更短: 这里我们构建一个int通道的通道: 或者函数通道:
参考文档,Go入门指南:协程与通道 |
请发表评论