Go语言中Channel机制
来源:互联网 发布:电脑的端口号怎么看 编辑:程序博客网 时间:2024/05/17 07:14
前段时间尝试了一点 Google 的 Go 语言,感觉其很多特性还是不错的。Go 语言旨在结合传统编译型的静态语言和解释型的动态语言的优点,在其中找到一个平衡。从而打造一个既快速(编译执行),又方便编程的语言(动态语言往往语法简单快捷)。同时,Go 语言还具备丰富的特性以支持并发编程,这在现在多核非常普及的情况下,是很重要和强大的一个功能。
Go 语言的并发特性主要有 goroutine, channel 等。
goroutine - 可以大致理解为一种轻量级的线程(或微线程),它是一种“分配在同一个地址空间内的,能够并行执行的函数”。同时,它是轻量级的,不需要像分配线程那样分配独立的栈空间。所以理论上讲,我们可以很容易的分配很多个 goroutine, 让它们并发执行,而其开销则比多线程程序要小得多,从而可以让程序支持比较大的并发性。
channel - 顾名思义,就是通道。通道的目的是用来传递数据。在一个通道上我们可以执行数据的发送(Send)和接受(Receive)操作。对于非缓冲的 channel 而言,Receive 方法执行时,会判断该通道上是否有值,如果没有就会等待(阻塞),直到有一个值为止。同样,在 channel 上有值,而尚未被一个 Receiver 接受的时候,Send 方法也会阻塞,直到 Channel 变空。这样,通过一个简单的机制就可以保证 Send 和 Receive 总是在不同的时间执行的,而且只有 Send 之后才能 Receive. 这样就避免了常规的多线程编程中数据共享的问题。正如 Go 语言的文档一句话所说:
Do not communicate by sharing memory; instead, share memory by communicating.
不要通过共享内存来沟通;而是通过沟通来共享内存。
在常规的多线程编程里,我们总是定义好一些类变量,如果这些变量有可能被多个线程同时访问,那么就需要加锁。这样带来了一定的编程复杂性,如果代码写的稍有bug,则会导致读/写到错误的值。
而通过 channel 来沟通,我们得到了一个更为清晰的沟通方式。两个线程(或者 goroutine)要读写相同的数据,则创建一个通道,双方通过对这个通道执行 Send / Receive 的操作来设值或取值即可,相对而言,比较不容易出错。
<<GO语言简介下>>
http://www.20ju.com/content/V227275.htm
- Go语言中Channel机制
- Go 语言中 channel 使用总结
- go语言channel关注点
- Go语言学习:Channel
- Go语言Channel详解
- Go语言 channel详解
- Go语言学习:Channel是什么?
- 【go 通道】go语言通道channel
- go中channel简单使用
- Go语言_Go语言的channel
- Go语言里channel的死锁
- Go语言 美妙的channel(上)
- Go语言 美妙的channel(下)
- [go语言]channel的一个“奇怪”特性
- TODO:Go语言goroutine和channel使用
- Go语言goroutine+channel+select简介
- go语言通道channel使用总结
- Go语言 Channel <- 箭头操作符 详解
- ExtJS 隐藏grid标题
- chrome五十大实用插件集合!
- 开源 免费 java CMS - FreeCMS1.2-功能说明-静态化管理
- HBase强制删除一个表
- 使用PyInstaller2将Python脚本转化为可执行文件(中-使用部分)(转载自博客园balian)
- Go语言中Channel机制
- linux下Python网络编程框架-Twisted安装手记
- android4.0默认界面旋转180之最近使用程序视图倒立
- xcode 常见错误解决方案
- IOS常用控件及编译器设置
- 锁定TextBox,ComboBox的方法
- readyState的四种状态的解析
- 如何将tomcat内自己的网站在外部让别人访问
- EJB 中stateless、stateful 会话bean的区别