go - go concurrency 串行打印
问题描述
我正在尝试同时打印但无法弄清楚为什么它的序列号,已将代码放在下面
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()
}
期望是 hi0 g1 hi2 g3
但我明白了
从 g 1 从 g 3 hi 0 hi 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()
}
推荐阅读
- javascript - javascript 循环类随时间和 CSS 关键帧而变化
- android - 三个片段与三个 Recyclerview。数据未显示
- ajax - Shopify API 调用错误:跨域读取阻止 (CORB) 阻止了跨域响应
- mysql - IN 函数不能与 JOINS 一起正常工作
- asp.net-web-api - 受 Azure AD B2C 保护的自动化端点测试
- f# - 如何在 F# 中检查值是否为空
- git - 如何配置本地分支以在 git 中永久跟踪不同命名的远程分支
- php - 从 mysql 获取数据并替换重复条目
- javascript - 对象对象作为悬停时元素的标题
- python - 从 .txt 文件中读取每 N 行(Python)