为什么我所谓的并行 Go 程序不是并行的

package main


import (

    "fmt"

    "runtime"

    "sync"

)


var wg sync.WaitGroup


func 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 终止程序


我错过了什么?


千万里不及你
浏览 164回答 2
2回答

慕码人8056858

你什么都不缺。它正在工作。调用没有出现“交错”(混合)不是因为它们没有被并行化,而是因为它们发生得非常快。您可以轻松添加一些调用以time.Sleep更好地查看并行化。通过睡眠,我们 100% 知道打印alphabets并且numbers应该隔行扫描。您的程序Sleep调用“强制”隔行扫描package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "sync"&nbsp; &nbsp; "time")var wg sync.WaitGroupfunc alphabets() {&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; for char := 'a'; char < 'a'+26; char++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("%c ", char)&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second * 2)&nbsp; &nbsp; }}func numbers() {&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; for number := 1; number < 27; number++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("%d ", number)&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second * 3)&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;}func main() {&nbsp; &nbsp; fmt.Println("Starting Go Routines")&nbsp; &nbsp; wg.Add(2)&nbsp; &nbsp; go alphabets()&nbsp; &nbsp; go numbers()&nbsp; &nbsp; fmt.Println("\nWaiting To Finish")&nbsp; &nbsp; wg.Wait()&nbsp; &nbsp; fmt.Println("\nTerminating Program")}笔记你可能已经知道这一点,但是设置GOMAXPROCS对这个例子是否并行执行没有任何影响,只是它消耗了多少资源。GOMAXPROCS 设置控制有多少操作系统线程尝试同时执行代码。例如,如果 GOMAXPROCS 为 4,那么即使有 1000 个 goroutine,程序也只会一次在 4 个操作系统线程上执行代码。该限制不计算在系统调用(如 I/O)中阻塞的线程。

慕无忌1623718

您是否有机会使用 Go 游乐场?当我在本地运行您的代码时,我得到:Starting Go RoutinesWaiting To Finish1 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&nbsp;Terminating Program游乐场本质上是确定性的。Goroutines 不会经常产生并且不会在多个线程中运行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go