Add fan-in/out messaging patterns

This commit is contained in:
Tamer Tas committed 2016-02-20 17:34:05 +02:00
1 parent 4f4ceb2dc1
commit a8f8670c1e
2 files changed
+73

No files matched your search

+33
View File
@@ -0,0 +1,33 @@
package fan
import "sync"
// In implements fan.In messaging pattern
// Merges different channels in one channel
func In(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
}