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 關注
- 187 瀏覽
添加回答
舉報