mirror of
https://github.com/crazybber/awesome-patterns.git
synced 2024-11-25 14:26:04 +03:00
example for david with sem + iterator
This commit is contained in:
parent
f5bf6c88bb
commit
5d9d262a26
45
concurrency/iterator_sem/main.go
Normal file
45
concurrency/iterator_sem/main.go
Normal file
@ -0,0 +1,45 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
generator := func() <-chan int {
|
||||
totalIteration := 30
|
||||
wg := &sync.WaitGroup{}
|
||||
wg.Add(totalIteration)
|
||||
concurrentCount := 20
|
||||
sem := make(chan bool, concurrentCount)
|
||||
defer close(sem)
|
||||
results := make(chan int, totalIteration)
|
||||
defer close(results)
|
||||
for i := 0; i < totalIteration; i++ {
|
||||
sem <- true
|
||||
go func(i int) {
|
||||
results <- generateNumber()
|
||||
<-sem
|
||||
wg.Done()
|
||||
}(i)
|
||||
}
|
||||
wg.Wait()
|
||||
return results
|
||||
}
|
||||
|
||||
results := generator()
|
||||
for r := range results {
|
||||
fmt.Println(r)
|
||||
}
|
||||
|
||||
fmt.Println("Finished!!!")
|
||||
}
|
||||
|
||||
func generateNumber() int {
|
||||
rand.Seed(time.Now().Unix())
|
||||
time.Sleep(time.Second)
|
||||
return rand.Intn(10000)
|
||||
}
|
Loading…
Reference in New Issue
Block a user