以下笔记内容来自于走进go语言基础语法课程-Go语言进阶与依赖管理一课 #青训营笔记创作活动
一、语言进阶
1.1并发&并行-Goroutine
并行是在多核计算机上面运行并发程序,go语言作为多线程程序可以充分发挥多核计算机的优势,高效运行。
协程: 用户态,轻量级线程,栈 (KB 级别),go语言可以做到上万个协程,因此更适合处理并发事务。
线程: 内核态,线程跑多个协程,栈 (MB 级别)
Go 中提供了个关键字 go 来让我们创建一个 Go 协程,当我们在函数或方法的调用之前添加个关键字 go ,这样我们就开启了一个 Go 协程,该函数或者方法就会在这个 Go 协程中运行。
下面是快速打印4次"hello goroutine:n"这句话,使用到并发编程,为什么不直接打印4次呢,因为直接打印4次是串行打印,不能满足快速的要求,从这个例子我们也可以看出Go处理并发的操作是十分简单快捷的。 只要在需要并发执行的函数前面加上go关键字即可使用协程运行。
func hello(i int) {
println("hello goroutine : n + fmt.Sprint(i))
}
func HelloGoRoutine() {
for i:= 0;i< 5;i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
在默认情况下,每个独立的 Go 应用运行时就创建了一个 Go 协程,其 main 函数就在这个 Go协程中运行,这个 Go 协程就被称为 go 主协程(main Goroutine,下面简称主协程) 。
二、通信机制
2.1 csp 通信顺序进程
提倡通过通信共享内存而不是通过共享内存而实现通信,需要加锁实现。
2.2 Channel
使用方法:
make(chan 元素类型,[缓冲大小])
无缓冲通道 make(chan int)
有缓冲通道 make(chan int,n) n为缓冲数量
以以下这段代码为例,通过通信实现共享内存。
func CalSquare(){
src := make(chan int) //无缓冲队列
dest := make(chan int,3) //有缓冲队列
//A子协程,发送0~9数字
go func (){
defer close(src)
for i := 0;i<10;i+ {
src<-i
}
}()
//B子协程,计算输入数字的平方
go func() {
defer close(dest)for i := range src {
dest <-i*i
}
}()
//主协程输出最后的平方数
for i := range dest {
//省略复杂操作
printin(i)
}
}