2 回答
TA贡献1803条经验 获得超6个赞
你什么都不缺。它正在工作。调用没有出现“交错”(混合)不是因为它们没有被并行化,而是因为它们发生得非常快。
您可以轻松添加一些调用以time.Sleep更好地查看并行化。通过睡眠,我们 100% 知道打印alphabets并且numbers应该隔行扫描。
您的程序Sleep调用“强制”隔行扫描
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func alphabets() {
defer wg.Done()
for char := 'a'; char < 'a'+26; char++ {
fmt.Printf("%c ", char)
time.Sleep(time.Second * 2)
}
}
func numbers() {
defer wg.Done()
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
time.Sleep(time.Second * 3)
}
}
func main() {
fmt.Println("Starting Go Routines")
wg.Add(2)
go alphabets()
go numbers()
fmt.Println("\nWaiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
笔记
你可能已经知道这一点,但是设置GOMAXPROCS对这个例子是否并行执行没有任何影响,只是它消耗了多少资源。
GOMAXPROCS 设置控制有多少操作系统线程尝试同时执行代码。例如,如果 GOMAXPROCS 为 4,那么即使有 1000 个 goroutine,程序也只会一次在 4 个操作系统线程上执行代码。该限制不计算在系统调用(如 I/O)中阻塞的线程。
TA贡献1744条经验 获得超4个赞
您是否有机会使用 Go 游乐场?当我在本地运行您的代码时,我得到:
Starting Go Routines
Waiting To Finish
1 2 3 4 5 6 7 8 9 10 11 12 a 13 14 15 16 17 b 18 19 c 20 21 d 22 23 e 24 25 f 26 g h i j k l m n o p q r s t u v w x y z
Terminating Program
游乐场本质上是确定性的。Goroutines 不会经常产生并且不会在多个线程中运行。
- 2 回答
- 0 关注
- 162 浏览
添加回答
举报