From eaa6f05ffd769b335e017d8052fd33854d1bef53 Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 6 May 2020 17:12:21 +0800 Subject: [PATCH] add a fanin pattern codes --- gomore/04_fan_in/fan_in.md | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 gomore/04_fan_in/fan_in.md diff --git a/gomore/04_fan_in/fan_in.md b/gomore/04_fan_in/fan_in.md new file mode 100644 index 0000000..2862bda --- /dev/null +++ b/gomore/04_fan_in/fan_in.md @@ -0,0 +1,41 @@ +# Fan-In Messaging Patterns + +=================================== +Fan-In is a messaging pattern used to create a funnel for work amongst workers (clients: source, server: destination). + +We can model fan-in using the Go channels. + +```go +// Merge different channels in one channel +func Merge(cs ...<-chan int) <-chan int { + var wg sync.WaitGroup + + out := make(chan int) + + // Start an send goroutine for each input channel in cs. send + // copies values from c to out until c is closed, then calls wg.Done. + send := func(c <-chan int) { + for n := range c { + out <- n + } + wg.Done() + } + + wg.Add(len(cs)) + for _, c := range cs { + go send(c) + } + + // Start a goroutine to close out once all the send goroutines are + // done. This must start after the wg.Add call. + go func() { + wg.Wait() + close(out) + }() + return out +} +``` + +The `Merge` function converts a list of channels to a single channel by starting a goroutine for each inbound channel that copies the values to the sole outbound channel. + +Once all the output goroutines have been started, `Merge` a goroutine is started to close the main channel.