golang的缓冲channel和无缓冲channel的区别

golang channel 有缓冲 与 无缓冲 是有重要区别的

我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式

其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别

那就是一个是同步的 一个是非同步的

怎么说?比如

c1:=make(chan int)        无缓冲

c2:=make(chan int,1)      有缓冲

c1<-1                            

无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着

而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。

打个比喻

无缓冲的  就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。

无缓冲保证信能到你手上

有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。

有缓冲的 保证 信能进你家的邮箱

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以通过使用 channel 来控制并发 goroutine 的数量。具体的实现方法是,创建一个带缓冲channel,并在启动 goroutine 之前将一些数据发送到 channel 中。每当一个 goroutine 启动时,从 channel 中读取一个数据,如果 channel 已经空了,则 goroutine 会被阻塞,直到有新的数据进入 channel。 这个方法的原理是,通过限制 channel 中数据的数量,从而限制同时运行的 goroutine 数量。当 channel 已满时,新的 goroutine 会被阻塞,直到有其他 goroutine 执行完毕,从而腾出一个 channel 位置。 下面是一个示例代码,使用 channel 控制同时运行的 goroutine 数量: ```go package main import ( "fmt" "time" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "started job", j) time.Sleep(time.Second) fmt.Println("worker", id, "finished job", j) results <- j * 2 } } func main() { const numJobs = 10 const numWorkers = 3 jobs := make(chan int, numJobs) results := make(chan int, numJobs) for w := 1; w <= numWorkers; w++ { go worker(w, jobs, results) } for j := 1; j <= numJobs; j++ { jobs <- j } close(jobs) for a := 1; a <= numJobs; a++ { <-results } } ``` 在这个示例代码中,我们创建了一个 `jobs` channel 和一个 `results` channel,并启动了三个 goroutine 来处理 `jobs` channel 中的任务。在 `main` 函数中,我们向 `jobs` channel 中发送了 10 个任务,并在最后等待所有任务完成。 可以看到,在启动 goroutine 时,我们使用了带缓冲的 `jobs` channel,来限制同时运行的 goroutine 数量。当 `jobs` channel 已满时,新的 goroutine 会被阻塞,直到有其他 goroutine 执行完毕,从而腾出一个 channel 位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值