I've got the following go code executing routines.
package main
import (
"fmt"
"time"
)
func count(id int) {
for i := 0; i < 10; i++ {
fmt.Println(id, ":", i)
time.Sleep(time.Millisecond * 1000)
}
}
func main() {
for i := 0; i < 10; i++ {
go count(i)
}
time.Sleep(time.Millisecond * 11000)
}
I would expect the output to be:
1 : 0
2 : 0
3 : 0
4 : 0
5 : 0
6 : 0
7 : 0
8 : 0
9 : 0
1 : 1
2 : 1
3 : 1
4 : 1
etc...
but instead, I get:
0 : 0
6 : 0
7 : 0
5 : 0
8 : 0
9 : 0
3 : 0
2 : 0
4 : 0
1 : 0
5 : 1
6 : 1
7 : 1
1 : 1
8 : 1
etc...
Why are they not in order of the original, outside for loop executing the count method? Why are some count methods getting out of sync?
When a goroutine executes is out of the control of the programmer. You have some control if you use signals via channels and sync.WaitGroup, (like having one goroutine wait until another has finished) but you cannot control the execution order of goroutines
As others already commented, goroutine is mainly aiming to concurrency. Concurrency can embrace parallelism and communication. If you want to control their order, you have to make them communicate through SIGNAL. For example, a goroutine waits for a signal from another one. Please check goroutine and channel in particular.