GO语言入门指南 :GO并发(一)| 青训营

112 阅读3分钟

GO语言入门指南 :GO并发(一)

GO并发

1. 概要

go 语言的并发编程,以下是需要了解的基础知识点,也是本文主要介绍的内容. 可以对照看看这些是否已经可以熟练运用了.

  • go(协程) : 通过关键字 go 即可创建一个协程.
  • chan :  golang 中用于并发的通道,用于协程的通信.
    • 有缓冲通道
    • 无缓冲通道
    • 单向通道
  • select: golang 提供的多路复用机制.
  • close() : golang 的内置函数, 可以关闭一个通道.
  • 阻塞: 阻塞是进程(也可以是线程、协程)的状态之一(新建、就绪、运行、阻塞、终止). 指的是当数据未准备就绪,这个进程(线程、协程)一直等待,这就是阻塞.
  • 非阻塞: 当数据为准备就绪,该进程(线程、协程)不等待可以继续执行,这就是非阻塞.
  • 同步: 在发起一个调用时,在没有得到结果之前,这个调用就不返回,这个调用过程一直在等待. 这是同步.
  • 异步: 在发起调用后,就立刻返回了,这次调用过程就结束了. 等到有结果了被调用方主动通知调用者结果. 这是异步.
  • sync: golang 标准库之一,提供了锁.
  • 定时器: golang 标准库 time 提供的重要功能, 提供了定时器功能,可用于超时处理.
    • Timer
    • Ticker

2. goroutine

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

语法格式

go 函数名( 参数列表 )

例如:

go f(a int, b int, c int){
  fmt.Println(a+b+c)
}(1,2,3)

3.chan

通道(channel)是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

创建通道需要用到make函数

无缓冲通道:
make (chan int)//创建一个通道 为int类型,传递int类型

有缓冲通道:
make (chan int ,5)//缓冲为5

通道一般默认为双向的,可接收和发送,单向创建如下

单向接受通道
var ch chan
  <- int
  
发送箭头相反就行

4.select

select与switch语句有点相像,该语句包含的每个case分支都持有一个针对通道的接受或发送的操作。 select会等待直到某个分支的操作就绪后,执行该操作及其关联的分支语句,可用于处理多个通道。

select {
case v1 := <-c1:
    fmt.Printf("received %v from c1\n", v1)
case v2 := <-c2:
    fmt.Printf("received %v from c2\n", v1)
case c3 <- 23:
    fmt.Printf("sent %v to c3\n", 23)
default:
    fmt.Printf("no one was ready to communicate\n")
}

5.close

close使用有几个重点:

  1. 只能关闭双向通道或者发送通道
  2. 它应该由发送者使用,而不应该由接受者调用
  3. 当通道关闭后,接受者都不再阻塞,
  4. 关闭通道后,依然可以从通道中读取值
  5. 所有元素读取完后,将返回通道元素的零值,并且读取检测值也是 false

之后的内容会在GO语言入门指南 :GO并发(二)在进行介绍