为什么我认为并行的程序不平行

Kom*_*omu 0 parallel-processing concurrency 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")
}
Run Code Online (Sandbox Code Playgroud)

我希望输出混合起来(因为没有更好的词),而是; 示例输出是:

$ go run parallel_prog.go

开始Go Routines等待完成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终止程序

我错过了什么?

谢谢,

Ezr*_*zra 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")
}
Run Code Online (Sandbox Code Playgroud)

注意

您可能已经知道这一点,但设置GOMAXPROCS对此示例是否并行执行没有任何影响,只是消耗了多少资源.

GOMAXPROCS设置控制多少操作系统线程同时尝试执行代码.例如,如果GOMAXPROCS为4,那么程序将只同时在4个操作系统线程上执行代码,即使有1000个goroutine.该限制不计算在I/O等系统调用中阻塞的线程.

来源:Go 1.5 GOMAXPROCS默认