Go:Goroutines和Channels

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))

(未完待续…)

发布了117 篇原创文章 · 获赞 15 · 访问量 5626

猜你喜欢

转载自blog.csdn.net/qq_34326321/article/details/104695534