PS: https://play.golang.org/p/ax_bsnEJ1Q
I added more goroutine to see what the result would be:
package main
import (
"runtime"
"fmt"
"sync"
)
func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
for i := 0; i < 5; i++ {
wg.Add(1)
fmt.Printf("%d: main\n", i)
go func (i int) {
fmt.Printf("%d: not main\n", i)
wg.Done()
} (i)
}
//time.Sleep(1 * time.Nanosecond)
wg.Wait()
}
https://play.golang.org/p/19bgbXJ54-
The result is like this:
0: main
1: main
2: main
3: main
4: main
4: not main
0: not main
1: not main
2: not main
3: not main
The fifth goroutine got executed first(except for the main goroutine).
And if I put the main goroutine to sleep for some time by uncomment the
sleep line, the result is:
0: main
1: main
2: main
3: main
4: main
0: not main
1: not main
2: not main
3: not main
4: not main
I am really confused with the results.
在 2017年8月20日星期日 UTC+8下午12:57:43,Yp Xie写道:
>
> Hi guys,
>
> I am learning golang with the fantastic book "Go in Action". And I have
> some problems with understanding when to switch a goroutine to be run in
> chapter 6.
>
> package main
>
> 1
> 2 import (
> 3 "fmt"
> 4 "runtime"
> 5 "sync"
> 6 )
> 7
> 8 func main() {
> 9 runtime.GOMAXPROCS(1)
> 10
> 11 var wg sync.WaitGroup
> 12 wg.Add(2)
> 13
> // first goroutine
> 14 go func() {
> 15 defer wg.Done()
> 16 for c := 0; c < 3; c++ {
> 17 for char := 'a'; char < 'a'+26; char++ {
> 18 fmt.Printf("%c", char)
> 19 }
> 20 }
> 21 fmt.Println("")
> 22 }()
> 23
> // second goroutine
> 24 go func() {
> 25 defer wg.Done()
> 26 for c := 0; c < 3; c++ {
> 27 for char := 'A'; char < 'A'+26; char++ {
> 28 fmt.Printf("%c", char)
> 29 }
> 30 }
> 31 fmt.Println("")
> 32 }()
> 33
> 34 wg.Wait()
> }
>
>
> Why the result is printing uppercase letters first?
>
> I mean the two goroutines are passed in a waiting queue in order of the
> time they were generated, and they were meant to be executed in the same
> order.
>
> So why the second goroutine got executed first?
>
> Or is the fmt.Println method is IO-related?
>
> Please help me understand this situation.
>
> Thanks!
>
>
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.