|
@@ -0,0 +1,56 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "math/rand"
|
|
|
+)
|
|
|
+
|
|
|
+func RunSim(name string, steps int) <-chan int {
|
|
|
+
|
|
|
+ spikechan := make(chan int)
|
|
|
+ go func() {
|
|
|
+ defer close(spikechan)
|
|
|
+ for t := 0; t < steps; t++ {
|
|
|
+ if rand.Float32() > 0.8 {
|
|
|
+ spikechan <- t
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }()
|
|
|
+
|
|
|
+ return spikechan
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+
|
|
|
+ a := RunSim("A", 100)
|
|
|
+ b := RunSim("B", 100)
|
|
|
+ c := RunSim("C", 100)
|
|
|
+
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case ta, ok := <-a:
|
|
|
+ if ok {
|
|
|
+ fmt.Printf("A spiked at %d\n", ta)
|
|
|
+ } else {
|
|
|
+ a = nil
|
|
|
+ }
|
|
|
+ case tb, ok := <-b:
|
|
|
+ if ok {
|
|
|
+ fmt.Printf("B spiked at %d\n", tb)
|
|
|
+ } else {
|
|
|
+ b = nil
|
|
|
+ }
|
|
|
+ case tc, ok := <-c:
|
|
|
+ if ok {
|
|
|
+ fmt.Printf("C spiked at %d\n", tc)
|
|
|
+ } else {
|
|
|
+ c = nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if a == nil && b == nil && c == nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|