我是Golang的新手,试图了解并发和并行。我读了下面提到的关于并发和并行的文章。我已经执行了相同的程序。但是没有得到相同的(字母和字符混合)输出。首先获取所有字母,然后获取字符。似乎并发工作不并行。

文章说添加 runtime.GOMAXPROCS(4)使其并行。

为什么我是而不是

我正在使用 4核CPU 系统和GO 版本1.8.2

https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html

我知道,如果我们添加Sleep,那么根据Concurrency concept,我可以看到并行输出。但是Parallelism表示,如果系统具有多个CPU,则每个线程将在一个CPU中运行,并成为并行进程。
我的问题是,尽管我的系统有4个核心并添加了runtime,但为什么我没有得到并行输出。GOMAXPROCS(4),。


转到程序

package main

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(2)

    var wg sync.WaitGroup
    wg.Add(2)

    fmt.Println("Starting Go Routines")
    go func() {
        defer wg.Done()

        for char := ‘a’; char < ‘a’+26; char++ {
            fmt.Printf("%c ", char)
        }
    }()

    go func() {
        defer wg.Done()

        for number := 1; number < 27; number++ {
            fmt.Printf("%d ", number)
        }
    }()

    fmt.Println("Waiting To Finish")
    wg.Wait()

    fmt.Println("\nTerminating Program")
}

我的输出
Starting Go Routines
Waiting To Finish
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 a
b c d e f g h i j k l m n o p q r s t u v w x y z
Terminating Program

预期输出(不相同,但并行输出)
Starting Go Routines
Waiting To Finish
a b 1 2 3 4 c d e f 5 g h 6 i 7 j 8 k 9 10 11 12 l m n o p q 13 r s 14
t 15 u v 16 w 17 x y 18 z 19 20 21 22 23 24 25 26
Terminating Program

最佳答案

由于在我上面的示例中for循环的条件为27,因此程序执行速度很快,并且看不到并行性。我写了不同的示例并增加了条件,然后才能看到Parallel输出。

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var wg sync.WaitGroup

func init() {
    fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!", runtime.NumCPU())

}
func main() {
    fmt.Println(" Welcome to concurrency")
    wg.Add(2)
    go one()
    go two()
    fmt.Println("Waiting To Finish")
    wg.Wait()
    fmt.Println("\nTerminating Program")

}

func one() {
    for i := 0; i < 200; i++ {
        fmt.Println("one", i)
    }
    defer wg.Done()
}

func two() {
    for i := 0; i < 200; i++ {
        fmt.Println("Two:", i)
    }
    defer wg.Done()
}

,2015年8月28日更新:将Go 1.5设置为使GOMAXPROCS的默认值与计算机上的CPU数量相同。我已经删除了运行时.GOMAXPROCS(4)

关于go - Golang平行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45784588/

10-11 17:04