并发串行打印
go concurrency prints serially
我正在尝试并发打印但无法弄清楚为什么它是连续的,已将代码放在下面
package main
import (
"fmt"
"sync"
)
func main() {
fmt.Println("Hello, playground")
var wg sync.WaitGroup
wg.Add(2)
go func(){
for i := 0; i < 4; i++ {
if i%2 == 0 {
fmt.Println("hi", i)
}
}
wg.Done()
}()
go func() {
for i := 0; i < 4; i++ {
if i%2 != 0 {
fmt.Println("g", i)
}
}
wg.Done()
}()
wg.Wait()
}
期望是
嗨0
g1
高2
g3
但我明白了
来自 g 1
从 g 3
嗨 0
嗨 2
这么小的函数不太可能证明并发性,因为第一个 goroutine 可能甚至在第二个 goroutine 开始之前完成,或者在上下文切换发生之前完成。如果在循环中添加一个小暂停,您将观察到交错:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
for i := 0; i < 4; i++ {
if i%2 == 0 {
fmt.Println("hi", i)
}
time.Sleep(10 * time.Millisecond)
}
wg.Done()
}()
go func() {
for i := 0; i < 4; i++ {
if i%2 != 0 {
fmt.Println("from g", i)
}
time.Sleep(10 * time.Millisecond)
}
wg.Done()
}()
wg.Wait()
}
我正在尝试并发打印但无法弄清楚为什么它是连续的,已将代码放在下面
package main
import (
"fmt"
"sync"
)
func main() {
fmt.Println("Hello, playground")
var wg sync.WaitGroup
wg.Add(2)
go func(){
for i := 0; i < 4; i++ {
if i%2 == 0 {
fmt.Println("hi", i)
}
}
wg.Done()
}()
go func() {
for i := 0; i < 4; i++ {
if i%2 != 0 {
fmt.Println("g", i)
}
}
wg.Done()
}()
wg.Wait()
}
期望是 嗨0 g1 高2 g3
但我明白了
来自 g 1 从 g 3 嗨 0 嗨 2
这么小的函数不太可能证明并发性,因为第一个 goroutine 可能甚至在第二个 goroutine 开始之前完成,或者在上下文切换发生之前完成。如果在循环中添加一个小暂停,您将观察到交错:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
for i := 0; i < 4; i++ {
if i%2 == 0 {
fmt.Println("hi", i)
}
time.Sleep(10 * time.Millisecond)
}
wg.Done()
}()
go func() {
for i := 0; i < 4; i++ {
if i%2 != 0 {
fmt.Println("from g", i)
}
time.Sleep(10 * time.Millisecond)
}
wg.Done()
}()
wg.Wait()
}