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使用有几个重点:
- 只能关闭双向通道或者发送通道
- 它应该由发送者使用,而不应该由接受者调用
- 当通道关闭后,接受者都不再阻塞,
- 关闭通道后,依然可以从通道中读取值
- 所有元素读取完后,将返回通道元素的零值,并且读取检测值也是 false