Golang Parallel

时间:2017-08-20 16:49:26

标签: go parallel-processing goroutine

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

文章说添加 runtime.GOMAXPROCS(4)以实现并行。

为什么我没有平行

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

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

我知道如果我们添加Sleep,那么根据Concurrency概念,我可以看到并行输出。但是Parallelism说如果系统有多个CPU,那么每个线程将在一个CPU中运行,它就变成了并行进程。 我的问题是为什么我没有获得并行输出,虽然我的系统有4个核心并添加了runtime.GOMAXPROCS(4),.

转到

log10

我的输出

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

3 个答案:

答案 0 :(得分:1)

由于for循环在上面的例子中有条件27,程序执行速度很快,无法看到并行性。我写了不同的例子并增加了条件然后我可以看到并行输出。

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数相同。我删除了runtime.GOMAXPROCS(4)

答案 1 :(得分:0)

在我看来,这段代码中有两个问题。 第一个想法:

 runtime.GOMAXPROCS(2)

使用此行只允许两个工作人员,但是您启动三个Go Routines(Main需要一个)。

但是Go Routines完成的主要问题太快了。添加

time.Sleep(100000)

会解决这个问题。 包主要

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

func main() {
    runtime.GOMAXPROCS(3)

    var wg sync.WaitGroup
    wg.Add(2)

    fmt.Println("Starting Go Routines")
    go func() {
        defer wg.Done()
        for char := 'a'; char < 'a'+26; char++ {
            for i := 0; i < 10000; i++ {
                _ = i * 2
            }
            fmt.Printf("%c ", char)
        }
    }()

    go func() {
        defer wg.Done()
        for number := 1; number < 27; number++ {
            for i := 0; i < 10000; i++ {
                _ = i * 2
            }
            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 a 5 b 6 c d 7 8 e f 9 g h 10 i j 11 k 12 l m 13 n 14 o p q 15 r 16    s 17 t u 18 v 19 w 20 x y 21 z 22 23 24 25 26 
Terminating Program

答案 2 :(得分:-1)

那是因为你的算法没有足够的操作来看到并行性。例如,尝试提高for语句的循环次数。