channel 和goroutine
协程数量
for i:=1;i<len(10);i++ {
go func(){
}()
}
这里的生成协程数就是10,瞬间同时生成10个goroutine
https://geektutu.com/post/hpg-concurrency-control.html
channel 缓冲区和无缓冲区
ch := make(chan int ,3) 有缓冲区
ch := make(chan int) 无缓冲区
区别
无缓冲区
当一个goroutine向channel存入数据时,此时没有另一个goroutine去取出数据。存入的channel就会产生堵塞,直到channel被取出。
先执行func匿名函数,但是函数是堵塞状态,等待到ch被释放才能执行func函数。先func -> main (wait goroutine) -> func ->main cha
有缓冲区
在没有被接受时,最多发送3个消息则被阻塞
channel限制协程的并发数
利用channel缓冲区去限制
例子见上图
channel缓冲区为3,执行了3次循环。channel中存储了3次循环的值。3个func同时执行了。控制了协程的并发数
综合
代码
package main
import (
"log"
"sync"
"time"
)
func main() {
count := 10
wg := sync.WaitGroup{}
ch := make(chan int, 3)
for i := 0; i < count; i++ {
wg.Add(1)
ch <- 1
go func(i int) {
defer wg.Done()
log.Printf("go func:%d\n", i)
time.Sleep(time.Second)
<-ch
}(i)
}
wg.Wait()
}
执行结果
➜ Desktop git:(master) ✗ go run chan.go
2021/11/19 01:29:53 go func:2
2021/11/19 01:29:53 go func:0
2021/11/19 01:29:53 go func:1
2021/11/19 01:29:54 go func:3
2021/11/19 01:29:54 go func:4
2021/11/19 01:29:54 go func:5
2021/11/19 01:29:55 go func:6
2021/11/19 01:29:55 go func:8
2021/11/19 01:29:55 go func:7
2021/11/19 01:29:56 go func:9