Golang 并发模式:扇入、扇出

个人喜爱 Golang 的最突出原因之一是:我们可以轻松构建高可用且非阻塞的程序。

在本系列文章中,我将尝试回忆 Golang 中可用的模式。我将采用每种模式,并详细讨论它们适合的位置以及如何有效地使用它们。

什么是扇入扇出。这是一种将数据从多个流或从一个流汇聚到多个流或管道的单一数据流的方法。

generate函数

为了讨论这个模式,我们首先需要一个数据源。这是一个可以用作数据源的数据生成器。

上面的函数显然返回一个只接收通道。

该函数的消费者只能从通道接收数据。
channelmake<-

扇入

现在我们有了数据源,让我们来创建模式中的“扇子”。让我们看看这个函数:

分析

  1. 在第 2、3 行中,我们创建了 2 个数据生成器c1和c2。
  2. 在第 5 行中,我们正在创建fanin通道,它将成为从c1和c2获取数据的汇聚通道。
  3. 在第 9 行和第 10 行中,根据通道c1和c2的数据可用性,将选择适当的情况并将相同的数据推送到通道fanin。

有用的场景

想想我们必须合并所有事件的场景

扇出

对于扇出功能,我们需要一组接受器,我们的生成器函数将在其中继续发送要处理的消息或作业。

对于这种情况,让我们将生成器函数更改为有一些延迟。

让我们逐行讨论。

ProcessorWorkerProcessorpostJobjobChannelstartProcesspostJobworkerworkerworkerworkerworkergoroutinedoneworkerworkerworker

如果我们运行代码,我们将看到下面的结果:


到这里,我们就结束对扇入和扇出模式的学习。我将在接下来的帖子中发布另一个设计模式。

快乐学习和分享。