The runtime does not give any guarentee when you use a go statement if the 
goroutine being spawned will run immediately, or if control will remain 
with the original goroutine. 

This program, https://play.golang.org/p/-OcCzgt4Jy, which pauses all 
goroutines while they are being created exhibits the same behaviour as you 
see and may explain what you are seeing.

On Friday, 11 November 2016 17:08:39 UTC+11, mspaul...@gmail.com wrote:
>
> Hello,
>
> I've written a small program to demonstrate what I am seeing.  If I use a 
> channel as a semaphore and set the size of the channel to 1, I would expect 
> that the executions of my handle function below would all be executed in 
> order, but it's not.  For some reason the last item in the list is always 
> handled first, and then the remaining items are handled in order.  Does 
> anyone know why I see this behavior?
>
> Program:
>
> package main
>
> import (
>  "fmt"
>  "sync"
>  "time"
> )
>
> var wg sync.WaitGroup
> var sem chan int
>
> func handle(i int) {
>  defer wg.Done()
>  fmt.Println("waiting: ", i)
>  sem <- 1
>  fmt.Println("processing: ", i)
>  time.Sleep(1 * time.Second)
>  <-sem
> }
>
> func main() {
>  sem = make(chan int, 1)
>  nums := []int{1, 2, 3, 4}
>
>  for _, i := range nums {
>    wg.Add(1)
>    go handle(i)
>  }
>  wg.Wait()
> }
>
> Output:
>
> waiting:  4
> processing:  4
> waiting:  1
> waiting:  2
> waiting:  3
> processing:  1
> processing:  2
> processing:  3
>
>
>
>

-- 
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