亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我所謂的并行 Go 程序不是并行的

為什么我所謂的并行 Go 程序不是并行的

Go
千萬里不及你 2021-10-18 17:19:17
package mainimport (    "fmt"    "runtime"    "sync")var wg sync.WaitGroupfunc alphabets() {    for char := 'a'; char < 'a'+26; char++ {        fmt.Printf("%c ", char)    }    wg.Done() //decrement number of goroutines to wait for}func numbers() {    for number := 1; number < 27; number++ {        fmt.Printf("%d ", number)    }    wg.Done()}func main() {    runtime.GOMAXPROCS(2)    wg.Add(2) //wait for two goroutines    fmt.Println("Starting Go Routines")    go alphabets()    go numbers()    fmt.Println("\nWaiting To Finish")    wg.Wait() //wait for the two goroutines to finish executing    fmt.Println("\nTerminating Program")}我希望輸出會混淆(因為沒有更好的詞),但是;示例輸出是:$ go run parallel_prog.go啟動 Go 例程等待完成 abcdefghijklmnopqrstu vwxyz 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 終止程序我錯過了什么?
查看完整描述

2 回答

?
慕碼人8056858

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)中阻塞的線程。


查看完整回答
反對 回復 2021-10-18
?
慕無忌1623718

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 不會經常產生并且不會在多個線程中運行。


查看完整回答
反對 回復 2021-10-18
  • 2 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號