Wasn't this already answered for you 
here? 
https://stackoverflow.com/questions/43152776/is-it-one-channel-ops-affect-another-channel-ops

On Saturday, April 1, 2017 at 1:35:12 PM UTC-4, Khalid Adisendjaja wrote:
>
> I made this simple script, trying to understand how is channel working, 
> somehow if channel "c" is sent after channel "b" is sent the last routine 
> is not being proceed,
> please see the runner function
>
> package main
>
> import (
>      "fmt"
>      "strconv"
>      "time"
> )
>
> func runner(idx int, c chan []int, b chan []int) {
>      var temp []int
>      fmt.Println("runner " + strconv.Itoa(idx))
>      bucket := <-b
>      for k, v := range bucket {
>           if v != 0 {
>                temp = append(temp, v)
>                bucket[k] = 0
>           }
>           if len(temp) == 5 {
>                break
>           }
>      }
>
>      //Strange condition if channel c is sent after channel b is sent,
>      //somehow the last runner is not being proceed
>      b <- bucket
>      c <- temp
>
>      //All runner ara all proceed if c is sent first
>   // c <- temp
>   // b <- bucket
>
> }
>
> func printer(c chan []int) {
>      for {
>           select {
>           case msg := <-c:
>                fmt.Println(msg)
>                time.Sleep(time.Second * 1)
>           }
>      }
> }
>
> func main() {
>
>      c := make(chan []int, 5)
>      bucket := make(chan []int)
>
>      go runner(1, c, bucket)
>      go runner(2, c, bucket)
>      go runner(3, c, bucket)
>      go runner(4, c, bucket)
>
>      bucket <- []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
> 16, 17, 18, 19, 20}
>
>      go printer(c)
>
>      var input string
>      fmt.Scanln(&input)
>
> }
>
>
>  
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to