simdemo.go 756 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. func RunSim(name string, steps int) <-chan int {
  7. spikechan := make(chan int)
  8. go func() {
  9. defer close(spikechan)
  10. for t := 0; t < steps; t++ {
  11. if rand.Float32() > 0.8 {
  12. spikechan <- t
  13. }
  14. }
  15. return
  16. }()
  17. return spikechan
  18. }
  19. func main() {
  20. a := RunSim("A", 100)
  21. b := RunSim("B", 100)
  22. c := RunSim("C", 100)
  23. for {
  24. select {
  25. case ta, ok := <-a:
  26. if ok {
  27. fmt.Printf("A spiked at %d\n", ta)
  28. } else {
  29. a = nil
  30. }
  31. case tb, ok := <-b:
  32. if ok {
  33. fmt.Printf("B spiked at %d\n", tb)
  34. } else {
  35. b = nil
  36. }
  37. case tc, ok := <-c:
  38. if ok {
  39. fmt.Printf("C spiked at %d\n", tc)
  40. } else {
  41. c = nil
  42. }
  43. }
  44. if a == nil && b == nil && c == nil {
  45. break
  46. }
  47. }
  48. }