1,并发 goroutine + channel
(1)goroutine go协程
相当于子进程 ,main函数为主协程 ,也是一个协程
当main函数结束时,go协程没有进行阻塞处理(如。channel、),那么go协程就不会被执行 除非在main协程加入 延时,(用来等待go协程结束用的)
func main() {
go func(){
fmt.Println("111")
}()
fmt.Println("222")
}
结果为
root@sun:~/go-basic# go run run.go
222
加入time.Sleep
func main() {
go func(){
fmt.Println("111")
}()
fmt.Println("222")
time.Sleep(time.Second)
}
结果为
root@sun:~/go-basic# go run run.go
222
111
(2)channel 通道
Golang基础(9):goroutine协程和channel通道 - 九卷 - 博客园
(select监听channel数据, 超时处理等)
一、无缓存通道
Ch := make(chan int)
特性:无缓存channel 写入一条通道后,就会直接堵塞,直到等待被读取
二,有缓存通道
Ch := make(chan int,5) 多个了参数5
特性:当写入5条数据后,若仍未进行读取、取出,就会堵塞
range作为读取,close关闭通道
func writeCh(ch chan int){
for i:=0;i<5;i++{
ch <- i
}
close(ch)
}
func main(){
ch := make(chan int,5)
go writeCh(ch)
for p:=range ch {
fmt.Println(p)
}
}
2,goroutine+ sync.WaitGroup
第一条中用sleep或者channel来阻塞,使得goroutine被执行的另一个思路
首先有4个步骤
var wg sync.WaitGroup
wg.Add(100) 将运行的次数设置为100
wg.Done() 调用一次,Add的次数-1
wg.Wait() 被调用时,会堵塞,直到Add值为0时,才会继续往下进行
func f(){
fmt.Println("go func")
}
func main(){
go f()
fmt.Println("main func")
}
此时只打印出 main func
import (
"fmt"
"sync"
// "time"
)
func f(wg *sync.WaitGroup){
for i:=0;i<10;i++ {
fmt.Println(i)
wg.Done()
}
}
func main(){
var wg sync.WaitGroup
wg.Add(10)
go f(&wg)
fmt.Println("main func")
wg.Wait()
}
打印出
root@sun:~/go-basic# go run run.go
main func
0123456789