[go-nuts] Re: Concurrency and order of execution
There is not any guarentee in your goroutine, But you could try it as:https://play.golang.org/p/JDRAP4mxdc On Friday, November 11, 2016 at 2:08:39 PM UTC+8, 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.
[go-nuts] Re: Concurrency and order of execution
Okay, that makes sense. I've updated my solution so that in the case that the channel only has a capacity of 1 the processing will be done without goroutines to ensure that it is done in serial. In the case that the channel capacity is larger then I don't care about how processing is ordered. Is this is a good solution below, or is there a better way to handle this? https://play.golang.org/p/J2bi4PJJFd On Thursday, November 10, 2016 at 10:18:16 PM UTC-8, Dave Cheney wrote: > > 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.
[go-nuts] Re: Concurrency and order of execution
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.