【发布时间】:2021-10-15 23:26:33
【问题描述】:
我正在尝试从 2 个 go 例程中打印 N 个数字:
goroutine odd():这只能打印奇数
goroutine even():这只能打印偶数
输出应该是: 1 2 3 4 5 6 7 8 9 10
我正在尝试使用sync.WaitGroup 解决这个问题。我有以下疑问:
第一季度。哪种并发机制最适合这个问题?通道、等待组、互斥锁等?如果您可以提供相同的工作代码,那将是理想的。
第二季度。为什么我无法通过以下代码正确打印序列?我做错了我无法纠正的事情。请帮忙改正。
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var wgO sync.WaitGroup
var wgE sync.WaitGroup
func even() {
defer wg.Done()
for i := 2; i <= 10; i += 2 {
wgE.Add(1)
wgO.Wait()
fmt.Println(i)
wgE.Done()
}
}
func odd() {
defer wg.Done()
for i := 1; i <= 10; i += 2 {
wgO.Add(1)
fmt.Println(i)
wgO.Done()
wgE.Wait()
}
}
func main() {
wg.Add(2)
go even()
go odd()
wg.Wait()
}
【问题讨论】:
-
不是专业人士,但我认为您列出的那些并发机制不是相互独立的,也不是相互排斥的。 Waitgroup 需要等待,直到 go 例程完成。需要通道来允许 go 例程和正常功能之间的通信。如果多个 go 例程访问相同的资源,互斥锁可以避免竞争条件。
-
并发的整个理念是并发、独立的执行流。使用并发来为您的问题建模是错误,您不会学到任何东西。基本上不可能做你想做的事:你必须强制你的 goroutines un并发。
-
如果输出需要有序,并发是错误的模型。
-
@Adrian:应该用什么来代替上述问题?你能推荐一下吗?
-
令人费解的你可能写过play.golang.org/p/XYPnLEe0KrW