今天来讲一下第二节课所学的知识,也是Go语言的高级应用。我们都知道Go是一个并发的编程,它的特点就是快。并发:多线程程序在一个核的cpu上运行。并行:多线程程序在多个核的cpu上运行。Go可以充分发挥多核优势,高效运行。 1.Goroutine 协程:用户态,轻量级线程,栈KB级别 线程:内核态,线程跑多个协程,栈MB级别 快速打印hello goroutine :0~hello gorountine :4
println("hello goroutine :"+fmt.Sprint(i))
}
func HelloGoRoutine(){
for i:=0;i<5;i++{
go func(j int){
hello(j)
}(i)
}
time.Sleep(time.Second)
}
2.CSP 提倡通过通信共享内存而不是通过共享内存而实现通信
3.Channel make(chan 元素类型,[缓冲大小]) *无缓冲通道 make(chan int) *有缓冲通道 make(chan int,2) A子协程发送0~9数字 B子协程计算输入数字的平方 主协程输出最后的平方数
src :=make(chan int)
dest :=make(chan int,3)
go func(){
defer close(src)
for i:=0;i<10;i++{
src<-i
}
}()
go func(){
defer close(dest)
for i:= range src{
dest <-i*i
}
}()
for i := range dest{
println(i)
}
}
4.并发安全LOCK 对变量执行2000次+1操作,5个协程并发执行
x int64
lock sync.Mutex
)
func addWithLock(){
for i :=0;i<2000;i++{
lock.Lock()
x+=1
lock.Unlock()
}
}
func addWithoutLock(){
for i :=0;i<2000;i++{
x +=1
}
}
x=0
for i:=0;i<5;i++{
go addWithoutLock()
}
time.Sleep(time.Second)
println(args...:"WithoutLock:",x)
x=0
for i:=0;i<5;i++{
go addWithLock()
}
time.Sleep(time.Second)
println(args...:"WithLock:",x)
}
5.WaitGroup 快速打印hello goroutine:0~hello goroutine:4
var wg sync.WaitGroup
wg.Add(delta:5)
for i:=0;i<5;i++{
go func (j int){
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
通过这一小节课的学习,我了解了Goroutine、Channel、Sync的基本概念和简单应用。