Go语言中的通信和并发


以下主要是在读《Go语言程序设计》时记录的一些笔记,关于Go语言的通信和并发相关的内容。

=Start=

goroutine是程序中与其他goroutine完全相互独立而并发执行的函数或者方法调用。

每一个程序至少包含一个goroutine,即会执行main包中的main()函数的主goroutine。

所有的goroutine共享相同的地址空间,同时Go语言提供了锁原语来保证数据能够安全的跨goroutine共享。然而,Go语言推荐的并发方式是通信(通道channel),而非共享数据

goroutine的创建语句:

go function(arguments)
go func(parameters) { block } (arguments)

用于发送和接收数据的语法:

  • channel <- value  //阻塞发送
  • <-channel  //接收并将其丢弃
  • x := <-channel  //接收并将其保存
  • x, ok := <-channel  //功能同上,同时检查通道是否已关闭或者是否为空

通道的创建语法:

  • make(chan Type) //没有声明缓冲区容量的通道就是同步的
  • make(chan Type, capacity) //异步通道

Go语言的select语句语法如下:

select {
    case sendOrReceive1: block1
    ...
    case sendOrReceiveN: blockN
    default: blockDefault
}

如果没有default语句,那么select语句可能会被阻塞。

====

使用通道的两个经验:

1.我们只有在后面检查通道是否关闭(例如在一个for…range循环里,或者select,或者使用<-操作符来检查是否可以接收等)的时候才需要显式地关闭通道;

2.应该由发送端的goroutine关闭通道,而不是由接收端的goroutine来完成。
如果通道并不需要检查是否被关闭,那么不关闭这些通道并没有什么问题,因为通道非常轻量,因此它们不会像打开文件不关闭那样耗尽系统资源。

=EOF=


《 “Go语言中的通信和并发” 》 有 9 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注