Concurrency in Go: Tools and Techniques for Developers by Katherine Cox-Buday

Concurrency in Go: Tools and Techniques for Developers by Katherine Cox-Buday

Author:Katherine Cox-Buday [Cox-Buday, Katherine]
Language: eng
Format: azw3, pdf
Publisher: O'Reilly Media
Published: 2017-07-19T04:00:00+00:00


Best Practices for Constructing Pipelines

Channels are uniquely suited to constructing pipelines in Go because they fulfill all of our basic requirements. They can receive and emit values, they can safely be used concurrently, they can be ranged over, and they are reified by the language. Let’s take a moment and convert the previous example to utilize channels instead:

generator := func(done <-chan interface{}, integers ...int) <-chan int { intStream := make(chan int) go func() { defer close(intStream) for _, i := range integers { select { case <-done: return case intStream <- i: } } }() return intStream } multiply := func( done <-chan interface{}, intStream <-chan int, multiplier int, ) <-chan int { multipliedStream := make(chan int) go func() { defer close(multipliedStream) for i := range intStream { select { case <-done: return case multipliedStream <- i*multiplier: } } }() return multipliedStream } add := func( done <-chan interface{}, intStream <-chan int, additive int, ) <-chan int { addedStream := make(chan int) go func() { defer close(addedStream) for i := range intStream { select { case <-done: return case addedStream <- i+additive: } } }() return addedStream } done := make(chan interface{}) defer close(done) intStream := generator(done, 1, 2, 3, 4) pipeline := multiply(done, add(done, multiply(done, intStream, 2), 1), 2) for v := range pipeline { fmt.Println(v) }

This code produces:



Download



Copyright Disclaimer:
This site does not store any files on its server. We only index and link to content provided by other sites. Please contact the content providers to delete copyright contents if any and email us, we'll remove relevant links or contents immediately.