Go語言 generator功能

http://www.golangpatterns.info/concurrency/generators

共 2 个回复


ChungMingSu2

## Go Language Patterns
Search this site
#### The Authorryannedolan.info
#### Recent site activity

Concurrency‎ > ‎
### Generators
Generators are functions that return the next value in a sequence each time the function is called:

generateInteger() => 0
generateInteger() => 1
generateInteger() => 2
....
This pattern can be used to implement iterators and introduce parallelism into loops.  Generators in Go are implemented with goroutines, though in other languages coroutines are often used.

## ParallelismIf the generator's task is computationally expensive, the generator pattern can allow a consumer to run in parallel with a generator as it produces the next value to consume.  For example, the goroutine behind the "produce" generator below can execute in parallel with "consume".

for {
consume(produce())
}
In some cases, the generator itself can be parallelized.  When a generator's task is computationally expensive and can be generated in any order (constrast with iterators), then the generator can be parallelized internally:

func generateRandomNumbers (n int) {
ch := make (chan float)     sem := make (semaphore, n)     for i := 0; i < n; i++ {``        go func () {
ch <- rand.Float()
sem.Signal()         } ()``    }     // launch extra goroutine to eventually close ch     go func () {         sem.Wait(n)         close(ch)     }         return ch``}### UsageThe following for-loop will print 100 random numbers.  The random numbers are generated in parallel and arrive in a random order.  Since the order doesn't matter, this prevents us from blocking unnecessarily.

for x := range generateRandomNumbers(100) { fmt.Println(x) }Note that generating random numbers in this way isn't very practical, since the parallelizing random number generator probably isn't worth the overhead of spawning so many goroutines.

登入|最近的協作平台活動|檢舉濫用情形|[列印頁面](javascript:;)|由 **Google 協作平台**技術提供




# 0

ChungMingSu2

平行處理功能 semaphore控制的作法

# 1