【问题标题】:How does the channel buffer work? [duplicate]通道缓冲区如何工作? [复制]
【发布时间】:2015-06-30 18:28:00
【问题描述】:

我通过一系列定义来弄清楚缓冲区是如何工作的,但我就是不明白。下面是一个示例,我更改了缓冲区的值,但我不知道它的作用。有人可以根据这个例子向我解释它并提供一些关于它如何/为什么工作的测试用例吗?谢谢。

package main

import (
    "fmt"
    "time"
)

func send(out, finish chan bool) {
    for i := 0; i < 5; i++ {
        out <- true
        time.Sleep(1 * time.Second)
        fmt.Println("Fin d'une écriture")
    }
    finish <- true
    close(out)
}
func recv(in, finish chan bool) {
    for _ = range in {
        fmt.Println("Fin d'une lecture")
        time.Sleep(10 * time.Second)
    }
    finish <- true
}
func main() {
    chanFoo := make(chan bool, 3)
    chanfinish := make(chan bool)
    go send(chanFoo, chanfinish)
    go recv(chanFoo, chanfinish)
    <-chanfinish
    <-chanfinish
}

【问题讨论】:

  • 我不太明白你在问什么。 channel spec 这里有什么不明白的地方吗?特别是关于容量的段落
  • @JimB 我不明白缓冲区部分!这对输出有何影响?!
  • 我确实访问过该链接之前并没有真正帮助我
  • 有人认为我的问题已经在某处得到了回答,但正如我所说的那样,它非常带来它并没有真正的帮助!!!
  • @Backhand 我写了几个例子,应该有助于澄清你的理解。如果仍然没有意义,请告诉我,我会尝试制作另一个演示。

标签: go


【解决方案1】:

如果通道没有缓冲区,则一次只能在其上发送一个项目。这意味着在其上发送的代码将阻塞,直到某个接收器从通道中读取该项目。这是一个人为的例子; https://play.golang.org/p/HM8jdIFqsN 主包

import (
    "fmt"
)


func main() {
   blocker := make(chan bool)
   nonBlocker := make(chan bool, 5)

   for i := 0; i < 5; i++ {
        nonBlocker <- true
        fmt.Println("We keep going")
   }

   go func () {

    for i := 0; i < 5; i++ {
        blocker <- true
        fmt.Println("We block cause that channel is full")
   } }()

}

我可以做很多其他的事情来演示相同的内容,但基本思想是,如果您将通道传递给某个 goroutine 并且通道没有缓冲,则在通道上发送的 goroutine 将阻塞,直到它发送的项目收到。使用缓冲通道,只要缓冲区容量不足,您就可以发送。基本上,如果您启动正在工作并返回结果的 goroutine,并且它们的移动速度比生成它们的代码快,您可能需要使用缓冲通道来打开瓶颈。

编辑:如果还不清楚发生了什么,请查看此; https://play.golang.org/p/9SXc4M1to4

package main

import (
    "fmt"
)


func main() {
   blocker := make(chan bool)
   nonBlocker := make(chan bool, 5)

   for i := 0; i < 5; i++ {
        nonBlocker <- true
        fmt.Println("We keep going")
   }

   go func () {

    for i := 0; i < 5; i++ {
        blocker <- true
        fmt.Println("Now we see this cause the reciever keeps opening the channel up again!")
   } }()

   for i := 0; i < 5; i++ {
      <-blocker
   }
}

【讨论】:

  • 非常感谢,我现在明白了!!我认为最让我困惑的是 goroutine 之间的时间!!谢谢你
  • @Backhand np,很高兴我能帮上忙。
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多