1、Goroutines
- 在Go语言中,每一个并发的执行单元叫作一个goroutine。
- 调用Goroutines:
go f() // create a new goroutine that calls f(); don't wait
- 从主函数退出或者直接终止程序,以及通过goroutine之间的通信 来达到让goroutine结束的操作.
2、Channels
1、基本概念
- 如果说goroutine是Go语音程序的并发体的话,那么channels它们之间的通信机制。
- 一个channels是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。
- 创建一个channels(比如发送int类型的channel):
ch := make(chan int)
- 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。
- channels的零值也是nil。两个相同类型的channel可以使用**==运算符比较**。
- 一个channel有发送和接收两个主要操作,都是通信行为。
- 写法:
ch <- x // a send statement 发送channel x = <-ch // a receive expression in an assignment statement 接收channel <-ch // a receive statement; result is discarded 接收channel但是不使用
- 使用内置的close函数就可以关闭一个channel:
close(ch)
,随后对基于该channel的任何发送操作都将导致panic异常。 - 对一个已经被close过的channel执行接收操作依然可以接受到之前已经成功发送的数据;如果channel中已经没有数据的话讲产生一个零值的数据。
2、不带缓存的channels
定义:
ch = make(chan int) // unbuffered channel
ch = make(chan int, 0) // unbuffered channel
一个基于无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channels上执行接收操作当发送的值通过Channels成功传输之后,两个goroutine可以继续执行后面的语句。
反之,如果接收操作先发生,那么接收者goroutine也将阻塞,直到有另一个goroutine在相同的Channels上执行发送操作。
基于无缓存Channels的发送和接收操作将导致两个goroutine做一次同步操作。也称为同步channels。
3、串联的Channels
Channels也可以用于将多个goroutine链接在一起,一个Channels的输出作为下一个Channels的输入。这种串联的Channels就是所谓的管道(pipeline)。
通过参数判断的方式,来获取channels是否关闭的结果:x, ok := <-naturals
4、单方向的channel
类型 chan<- int 表示一个只发送int的channel,只能发送不能接收。相反,类型 <-chan int 表示一个只接收int的channel,只能接收不能发送。
5、带缓存的Channels
声明:
发送操作就是向内部缓存队列的尾部插入元素,接收操作则是从队列的头部删除元素。
如果内部缓存队列是满的,那么发送操作将阻塞直到因另一个goroutine执行接收操作而释放了新的队列空间。
可以用内置的cap函数获取channels容量:fmt.Println(cap(ch))
(未完待续…)