Go – 何时使用缓冲通道?

缓冲通道的用例是什么?如果我想要多个并行动作,我可以使用默认的同步通道eq.

package main
import "fmt"
import "time"

func longLastingProcess(c chan string) {
    time.Sleep(2000 * time.Millisecond)
    c <- "tadaa"
}

func main() {
    c := make(chan string)
    go longLastingProcess(c)
    go longLastingProcess(c)
    go longLastingProcess(c)
    fmt.Println(<- c)
}

增加缓冲区大小的实际情况是什么?

最佳答案
通常情况下,通道缓冲是有利于性能的.

如果使用事件流或数据流方法来设计程序,通道将提供事件在一个进程和另一个进程之间传递的方法(我使用与托尼·霍尔通信顺序进程(CSP)相同意义上的过程, ,即与goroutine有效地代表同义词).

>有时程序需要其组件保持锁步同步.在这种情况下,需要无缓冲的通道.
>否则,将通道添加缓冲区通常是有益的.这应该被看作是一个优化步骤(如果没有设计出来,死锁可能仍然是可能的).
通过使用小缓冲区(example)的通道,可以实现新颖的油门结构.
>有一些特殊的覆盖或有损形式的通道用于修复某些循环(或循环)的特殊情况,否则可能会死锁.通过编写覆盖goroutine缓冲区(example)也可以在Go中实现.

您不应该添加缓冲来修复死锁.如果你的程序死锁,那么通过零缓冲开始来解决这个问题,通过依赖关系来思考.然后添加缓冲,当你知道它不会死锁.

您可以组合构建goroutines – 也就是说,goroutine本身可以包含goroutine.这是CSP的一个功能,并大大提高了可扩展性.在设计外部使用组作为自包含组件时,一组goroutine之间的内部通道不感兴趣.这个原则可以越来越大的规模重复应用.

转载注明原文:Go – 何时使用缓冲通道? - 代码日志