为了账号安全,请及时绑定邮箱和手机立即绑定

何时使用缓冲通道?

何时使用缓冲通道?

Go
隔江千里 2021-05-04 13:22:25
缓冲通道的用例是什么?如果我想执行多个并行操作,则可以使用默认的同步通道eq。package mainimport "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)}增加缓冲区大小的实际情况是什么?
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

通常,出于性能原因,通道中的缓冲是有益的。

如果程序是使用事件流或数据流方法设计的,则通道为事件在一个过程和另一个过程之间传递提供了手段(我使用术语过程的含义与Tony Hoare的通信顺序过程(CSP)相同。 ,即与goroutine有效地同义)。

  • 有时,程序需要其组件保持锁步同步。在这种情况下,需要无缓冲的通道。

  • 否则,向通道添加缓冲通常是有益的。这应该被视为优化步骤(如果没有设计出来的话,仍然可能出现死锁)。

  • 通过使用带有小缓冲区的通道(示例),可以实现新颖的节气门结构。

  • occamjcsp中使用特殊的通道覆盖或有损通道形式来修复进程循环(或循环)的特殊情况,否则这种情况可能会死锁。通过编写覆盖goroutine缓冲区(示例),在Go中也可以做到这一点。

您绝不应该仅仅为了解决死锁而添加缓冲。如果您的程序陷入僵局,则从零缓冲开始并仔细考虑依赖关系,可以轻松解决问题。然后在知道不会死锁的情况下添加缓冲。

您可以组合地构造goroutine-即goroutine本身可能包含goroutine。这是CSP的一项功能,极大地提高了可伸缩性。当将goroutine组的外部使用设计为独立组件时,它们之间的内部通道就不会引起关注。可以在越来越大的规模上重复应用此原理。


查看完整回答
反对 回复 2021-05-31
?
繁花如伊

TA贡献2012条经验 获得超12个赞

给出一个更具体的用例:

假设您希望您的通道代表一个任务队列,以便任务调度程序可以将作业发送到队列中,并且工作线程可以通过在通道中接收作业来消耗该作业。

进一步假设,尽管通常您希望每项作业都能得到及时处理,但工人完成一项任务所需的时间要比调度员安排该任务所需的时间长。

拥有缓冲区可以使调度程序将作业存储在队列中,并且仍保持对用户输入(或网络流量或其他任何内容)的响应,因为在工作人员每次调度任务之前,它都不需要睡觉,直到工作人员准备好为止。取而代之的是,它开展业务,并信任工人在一个安静的时期赶上来。

如果您想要一个处理特定软件的EVEN MORE CONCRETE示例,那么我将尽我所能,但是我希望这能满足您的需求。


查看完整回答
反对 回复 2021-05-31
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

如果通道的接收器总是比发送器慢,那么最终将消耗任何大小的缓冲区。这将使您拥有一个通道,该通道像无缓冲通道一样经常暂停执行例程,因此您最好使用无缓冲通道。

如果除了偶尔的突发之外,接收方通常比发送方更快,则缓冲的通道可能会有所帮助,并且应将缓冲区设置为典型的突发大小,您可以通过在运行时进行测量来获得该大小。

作为缓冲通道的替代方法,最好在通道上发送一个数组或一个包含数组的结构以处理突发/批次。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信