channel 和goroutine

协程数量

for i:=1;i<len(10);i++ {
    go func(){
    }()
}

​ 这里的生成协程数就是10,瞬间同时生成10个goroutine

image-20220106093526527

https://geektutu.com/post/hpg-concurrency-control.html


channel 缓冲区和无缓冲区

ch := make(chan int ,3) 有缓冲区
ch := make(chan int)	无缓冲区

区别

无缓冲区

当一个goroutine向channel存入数据时,此时没有另一个goroutine去取出数据。存入的channel就会产生堵塞,直到channel被取出。

image-20220106094007264

链接

先执行func匿名函数,但是函数是堵塞状态,等待到ch被释放才能执行func函数。先func -> main (wait goroutine) -> func ->main cha

有缓冲区

在没有被接受时,最多发送3个消息则被阻塞

img

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

https://segmentfault.com/a/1190000017956396

posted @ 2022-01-06 09:49  how=time  阅读(44)  评论(0编辑  收藏  举报