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

https://segmentfault.com/a/1190000017956396

以上是关于channel 和goroutine的主要内容,如果未能解决你的问题,请参考以下文章

Goroutines和Channels

Goroutines和Channels

Goroutines和Channels

Go教程(十三)goroutine和channel

Go教程(十三)goroutine和channel

Go教程(十三)goroutine和channel