Go语言工程实践 | 青训营

43 阅读1分钟

今天来讲一下第二节课所学的知识,也是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的基本概念和简单应用。