Skip to content

Instantly share code, notes, and snippets.

@mhewedy
Last active August 19, 2019 02:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mhewedy/2e7a07b4586e37076cc3680a777eca48 to your computer and use it in GitHub Desktop.
Save mhewedy/2e7a07b4586e37076cc3680a777eca48 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"github.com/fatih/color"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(11)
const numElements = 20
ch := make(chan int)
orderCh := make(chan int, numElements)
for i := 0; i < 10; i++ {
go func(i int) {
for v := range ch {
fmt.Println(color.RedString("unordered element:%v", v))
orderCh <- v
}
wg.Done()
}(i)
}
for i := 0; i < numElements; i++ {
ch <- i
}
close(ch)
var values = make([]int, 0, numElements)
for v := range orderCh {
latest := -1
if len(values) > 0 {
latest = values[len(values)-1]
}
if v == latest+1 {
values = append(values, v)
fmt.Println(color.GreenString("ordered element:%v", v))
} else {
orderCh <- v // resend to the channel
fmt.Println("value", color.YellowString("%v", v), "resent")
}
if len(values) == cap(values) {
close(orderCh)
}
}
wg.Done()
wg.Wait()
}
@mhewedy
Copy link
Author

mhewedy commented Aug 18, 2019

unordered element:4
unordered element:10
unordered element:11
unordered element:12
unordered element:3
unordered element:14
unordered element:5
unordered element:2
unordered element:16
unordered element:18
unordered element:19
unordered element:13
unordered element:7
unordered element:9
unordered element:8
unordered element:17
unordered element:6
unordered element:15
unordered element:1
unordered element:0
value 4 resent
value 10 resent
value 11 resent
value 12 resent
value 3 resent
value 14 resent
value 5 resent
value 2 resent
value 16 resent
value 18 resent
value 4 resent
value 19 resent
value 13 resent
value 7 resent
value 9 resent
value 8 resent
value 17 resent
value 6 resent
value 15 resent
value 1 resent
ordered element:0
value 10 resent
value 11 resent
value 12 resent
value 3 resent
value 14 resent
value 5 resent
value 2 resent
value 16 resent
value 18 resent
value 4 resent
value 19 resent
value 13 resent
value 7 resent
value 9 resent
value 8 resent
value 17 resent
value 6 resent
value 15 resent
ordered element:1
value 10 resent
value 11 resent
value 12 resent
value 3 resent
value 14 resent
value 5 resent
ordered element:2
value 16 resent
value 18 resent
value 4 resent
value 19 resent
value 13 resent
value 7 resent
value 9 resent
value 8 resent
value 17 resent
value 6 resent
value 15 resent
value 10 resent
value 11 resent
value 12 resent
ordered element:3
value 14 resent
value 5 resent
value 16 resent
value 18 resent
ordered element:4
value 19 resent
value 13 resent
value 7 resent
value 9 resent
value 8 resent
value 17 resent
value 6 resent
value 15 resent
value 10 resent
value 11 resent
value 12 resent
value 14 resent
ordered element:5
value 16 resent
value 18 resent
value 19 resent
value 13 resent
value 7 resent
value 9 resent
value 8 resent
value 17 resent
ordered element:6
value 15 resent
value 10 resent
value 11 resent
value 12 resent
value 14 resent
value 16 resent
value 18 resent
value 19 resent
value 13 resent
ordered element:7
value 9 resent
ordered element:8
value 17 resent
value 15 resent
value 10 resent
value 11 resent
value 12 resent
value 14 resent
value 16 resent
value 18 resent
value 19 resent
value 13 resent
ordered element:9
value 17 resent
value 15 resent
ordered element:10
ordered element:11
ordered element:12
value 14 resent
value 16 resent
value 18 resent
value 19 resent
ordered element:13
value 17 resent
value 15 resent
ordered element:14
value 16 resent
value 18 resent
value 19 resent
value 17 resent
ordered element:15
ordered element:16
value 18 resent
value 19 resent
ordered element:17
ordered element:18
ordered element:19

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment