channel 和goroutine
Posted 慢就是快,少就是多。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于channel 和goroutine的主要内容,如果未能解决你的问题,请参考以下文章