Golang并列主义

时间:2018-10-22 11:21:42

标签: go concurrency parallel-processing

我最近在Go中阅读了很多有关并行性和并发性的文章,而我对此一无所知。当我阅读this article about concurrency and parallelism in Go时,遇到了以下语句:

  

我们可以看到goroutine实际上是并行运行的。都   goroutines立即开始运行,您可以同时看到它们   争夺标准以展示其结果。

此语句与此程序有关:

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
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

因此,这是否意味着在运行时中,从goroutines同时执行两个周期(因此,此时我们可以调用Go并行语言),或者调度程序仅在这两个线程之间切换上下文(可能在fmt.Printf调用中) )并一次只执行一个循环(并发,不是真正的并行性,正如上面引用的作者所述)?

我很困惑。

1 个答案:

答案 0 :(得分:1)

在您的情况下,同时打印a-z和1-27的函数都同时启动,并且您要等到两个go例程都结束为止。在拥有多个go例程的同时,您的想法必须是并发的,但是如果您的硬件支持,它们可能会并行运行。

Concurreny is not parallelism

上下文切换也很繁琐,因此大多数时候它们很可能没有完成。 Go例程真的很简单,可以同时运行数百个例程。