代码之家  ›  专栏  ›  技术社区  ›  Src

哥朗平行论

  •  -1
  • Src  · 技术社区  · 7 年前

    this article about concurrency and parallelism in Go ,我遇到了这样一种说法:

    我们可以看到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同时执行2个周期(因此,此时我们可以调用Go parallel language)或scheduler只是在这两个线程之间切换上下文(可能是on格式打印F一次只执行一个循环(并发,不是真正的并行,正如作者在上面的引文中提到的)?

    1 回复  |  直到 7 年前
        1
  •  1
  •   pr0p    7 年前

    在您的例子中,打印a-z和1-27的函数同时启动,您将等待两个go例程结束。当有几个go例程时,您的想法必须是并发的,但是如果您的硬件支持,它们可能会并行运行。

    Concurreny is not parallelism

    此外,上下文切换很重,所以大多数情况下它们很可能没有完成。围棋的程序非常简单,可以同时运行数百个。